Erstellen eines Pseudoterminals, um Sudo glücklich zu machen

7

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.
  • 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?

Larsks
quelle
Gute Frage. Ich habe vor einiger Zeit ein wenig experimentiert screen, musste aber normalerweise die Ausgabe an eine andere Stelle umleiten cat, nachdem der Bildschirmbefehl ausgeführt wurde. Die -tssh-Option scheint jedoch weniger hackisch :)
Adam Eberlin

Antworten:

6

Sie möchten die -tOption 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.

Möglicherweise müssen Sie verwenden, -ttwenn das Skript nicht interaktiv ausgeführt werden soll.

mgorven
quelle
Es war tatsächlich das, was -ttich vermisst habe. Ich rufe sshüber pdshan und die Verbindungen haben keine lokale Pty. Das geht wirklich zum Leseverständnis meinerseits, denke ich. Danke für den Zeiger!
Larsks