Cloud

創建一個偽終端讓 sudo 開心

  • October 24, 2012

我需要自動配置一個雲實例(執行 Fedora 17),以下初始事實是正確的:

  • 我對遠端使用者具有基於 ssh-key 的訪問權限 ( cloud)
  • 該使用者通過sudo.

手動配置就像登錄和執行一樣簡單sudo su -,但我想完全自動化這個過程。訣竅是系統預設為requiretty啟用該選項sudo,這意味著嘗試執行以下操作:

ssh remotehost sudo yum -y install puppet

將失敗:

sudo: sorry, you must have a tty to run sudo

我現在正在通過首先推送一個將在偽終端上執行命令的小型 Python 腳本來解決這個問題:

import os
import sys
import errno
import subprocess

pid, master_fd = os.forkpty()

if pid == 0:
   # child process: now that we're attached to a
   # pty, run the given command.
   os.execvp(sys.argv[1], sys.argv[1:])
else:
   while True:
       try:
           data = os.read(master_fd, 1024)
       except OSError, detail:
           if detail.errno == errno.EIO:
               break

       if not data:
           break

       sys.stdout.write(data)

   os.wait()

假設這是命名pty的,然後我可以執行:

ssh remotehost ./pty sudo yum -y install puppet

這很好用,但我想知道是否已經有我沒有考慮過的解決方案。

  • 我通常會考慮expect,但預設情況下它沒有安裝在這個系統上。
  • screen可以在緊要關頭做到這一點,但我想出的最好的是:
screen -dmS sudo somecommand

…這確實有效,但會消耗輸出。

是否有任何其他可用的工具可以為我分配一個普遍可用的偽終端?

您希望-t選擇ssh

-t      Force pseudo-tty allocation.  This can be used to execute
        arbitrary screen-based programs on a remote machine, which can be
        very useful, e.g. when implementing menu services.  Multiple -t
        options force tty allocation, even if ssh has no local tty.

-tt如果腳本要以非互動方式執行,您可能需要使用。

引用自:https://serverfault.com/questions/441788