Cloud
創建一個偽終端讓 sudo 開心
我需要自動配置一個雲實例(執行 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
如果腳本要以非互動方式執行,您可能需要使用。