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 requirettyOption 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. screenIch 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-tssh-Option scheint jedoch weniger hackisch :)