Ich muss die Bereitstellung einer Cloud-Instanz (unter Fedora 17) automatisieren, für die die folgenden anfänglichen Fakten zutreffen:
- Ich habe SSH-Schlüssel-basierten Zugriff auf einen Remote-Benutzer (
cloud
) - Dieser Benutzer hat einen kennwortfreien Root-Zugriff über
sudo
.
Die manuelle Konfiguration ist so einfach wie das Anmelden und Ausführen sudo su -
und das Anwenden, aber ich möchte diesen Prozess vollständig automatisieren. Der Trick besteht darin, dass das System standardmäßig die requiretty
Option aktiviert hat sudo
, was bedeutet, dass versucht wird, Folgendes zu tun:
ssh remotehost sudo yum -y install puppet
Wird versagen:
sudo: sorry, you must have a tty to run sudo
Ich arbeite gerade daran, indem ich zuerst ein kleines Python-Skript überschreibe, das einen Befehl auf einem Pseudoterminal ausführt:
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()
Unter der Annahme, dass dies benannt ist pty
, kann ich dann ausführen:
ssh remotehost ./pty sudo yum -y install puppet
Das funktioniert gut, aber ich frage mich, ob es bereits Lösungen gibt, die ich nicht in Betracht gezogen habe.
- Normalerweise würde ich darüber nachdenken
expect
, aber es ist nicht standardmäßig auf diesem System installiert. screen
Ich kann das zur Not tun, aber das Beste, was ich mir ausgedacht habe, war:screen -dmS sudo somecommand
... was funktioniert, aber die Ausgabe frisst.
Gibt es andere Tools, die mir ein Pseudoterminal zuweisen, die allgemein verfügbar sein werden?
screen
, musste aber normalerweise die Ausgabe an eine andere Stelle umleitencat
, nachdem der Bildschirmbefehl ausgeführt wurde. Die-t
ssh-Option scheint jedoch weniger hackisch :)