Pseudo-Terminal wird nicht zugewiesen, da stdin kein Terminal ist

345

Ich versuche, ein Shell-Skript zu schreiben, das einige Verzeichnisse auf einem Remote-Server erstellt und dann mit scp Dateien von meinem lokalen Computer auf den Remote-Computer kopiert. Folgendes habe ich bisher:

ssh -t user@server<<EOT
DEP_ROOT='/home/matthewr/releases'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR
exit
EOT

scp ./dir1 user@server:$REL_DIR
scp ./dir2 user@server:$REL_DIR

Immer wenn ich es starte, erhalte ich folgende Meldung:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Und das Drehbuch hängt einfach für immer.

Mein öffentlicher Schlüssel ist auf dem Server vertrauenswürdig und ich kann alle Befehle außerhalb des Skripts problemlos ausführen. Irgendwelche Ideen?

Matthew
quelle
4
Sie können einfach das Terminal angeben, das verwendet werden soll, wiessh user@server /bin/bash <<EOT…
Buzut
3
@Buzut: Sie meinen wahrscheinlich Shell , aber ja, /bin/bashexplizite Angabe ist eine Möglichkeit, das Problem zu vermeiden.
mklement0
1
@ mklement0 in der Tat, das habe ich gemeint. Danke für die Korrektur;)
Buzut

Antworten:

512

Versuchen Sie ssh -t -t(oder ssh -ttkurz), die Pseudo-Tty-Zuweisung zu erzwingen, auch wenn stdin kein Terminal ist.

Siehe auch: Beenden der SSH-Sitzung, die vom Bash-Skript ausgeführt wird

Von der SSH-Manpage:

-T      Disable pseudo-tty allocation.

-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.
carok
quelle
21
Ich habe ein ähnliches Problem in einem Skript, das hier ausgeführt wird. Ich habe das -t -t hinzugefügt, aber jetzt wird ein neuer Fehler angezeigt. "tcgetattr: Unangemessenes ioctl für Gerät"
MasterZ
5
Warum ssh -t -tund nicht ssh -tt? Gibt es einen Unterschied, den ich nicht kenne?
Jack
3
@MasterZ Gleiches hier. Es wäre schön, eine Antwort darauf zu bekommenInappropriate IOCtl for device
krb686
11
@ Jack -ttund -t -tsind gleichwertig; Das separate oder zusammengesteckte Festlegen von Argumenten ist eine Frage des persönlichen Stils / der persönlichen Präferenz, und wenn es darauf ankommt, gibt es gültige Argumente dafür. aber wirklich, es ist nur eine persönliche Präferenz.
JDS
5
Was bedeutet es, wenn dort steht "auch wenn ssh keine lokale tty hat"?
CMCDragonkai
192

Auch mit Option -Taus dem Handbuch

Deaktivieren Sie die Pseudo-Tty-Zuordnung

Emil Bojda
quelle
11
Diese Antwort benötigt mehr Punkte - es ist die richtige Antwort und nicht zu lang wie die Antwort von zanco. Es ist absurd, dass "oh, ordne ein TTY sowieso mit -t -t zu" 107 Punkte erhält, wenn du es einfach ganz überspringen
kannst
2
Nur positiv bewertet; es hat besser für mich funktioniert als -t-t
Vincent Hiribarren
15
'-t -t' funktioniert, aber mit '-T' bekomme ich 'sudo: Entschuldigung, Sie müssen eine tty haben, um sudo auszuführen'
Ivan Balashov
3
@nhed: Die -ttOption erscheint am besten für diejenigen von uns, die tatsächlich ein TTY wollen und die Fehlermeldung des OP erhalten. Diese -TAntwort ist besser, wenn Sie das TTY nicht benötigen.
ErichBSchulz
3
@nhed - sicher - aber ich bin sicher, dass andere wie ich vom Googeln des Fehlers in der Fehlermeldung hierher gekommen sind. Es erscheint nicht unangemessen, klar zu machen, wie andere Googler zwischen zwei konkurrierenden Antworten wählen sollten. oder vielleicht nicht. Ich weiß nicht
ErichBSchulz
90

Per zanco Antwort , ich sofern Sie nicht einen Remote - Befehl zu ssh, da , wie die Shell die Befehlszeile analysiert. Um dieses Problem zu lösen, ändern Sie die Syntax Ihres sshBefehlsaufrufs so, dass der Remote-Befehl aus einer syntaktisch korrekten mehrzeiligen Zeichenfolge besteht.

Es gibt verschiedene Syntaxen, die verwendet werden können. Da Befehle beispielsweise in bashund shund wahrscheinlich auch in andere Shells weitergeleitet werden können, besteht die einfachste Lösung darin, den sshShell-Aufruf einfach mit Heredocs zu kombinieren :

ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

Beachten Sie, dass das Ausführen der obigen Schritte ohne /bin/bash die Warnung führt Pseudo-terminal will not be allocated because stdin is not a terminal. Beachten Sie auch, dass dies EOTvon einfachen Anführungszeichen umgeben ist, sodass bashder Heredoc als Nowdoc erkannt wird und die Interpolation lokaler Variablen deaktiviert wird , sodass der Befehlstext unverändert übergeben wird ssh.

Wenn Sie ein Fan von Pfeifen sind, können Sie die oben genannten Punkte wie folgt umschreiben:

cat <<'EOT' | ssh user@server /bin/bash
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

Die gleiche Einschränkung /bin/bashgilt für die oben genannten.

Ein anderer gültiger Ansatz besteht darin, den mehrzeiligen Remote-Befehl als einzelne Zeichenfolge zu übergeben, wobei mehrere Ebenen bashvariabler Interpolation wie folgt verwendet werden:

ssh user@server "$( cat <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
)"

Die obige Lösung behebt dieses Problem auf folgende Weise:

  1. ssh user@serverwird von bash analysiert und als sshBefehl interpretiert , gefolgt von einem Argument user@server, das an den sshBefehl übergeben werden soll

  2. "beginnt eine interpolierte Zeichenfolge, die nach Abschluss ein Argument enthält, das an den sshBefehl übergeben werden soll. In diesem Fall wird dies als Remotebefehl interpretiert ssh, als den ausgeführt werden solluser@server

  3. $( Startet die Ausführung eines Befehls, wobei die Ausgabe von der umgebenden interpolierten Zeichenfolge erfasst wird

  4. catist ein Befehl zum Ausgeben des Inhalts einer beliebigen Datei. Die Ausgabe von catwird an die erfasste interpolierte Zeichenfolge zurückgegeben

  5. <<beginnt ein Bash Heredoc

  6. 'EOT'Gibt an, dass der Name des Heredocs EOT ist. Die einfachen Anführungszeichen 'um EOT geben an, dass der Heredoc als Nowdoc analysiert werden soll. Dies ist eine spezielle Form des Heredoc, bei der der Inhalt nicht durch Bash interpoliert, sondern im Literalformat weitergegeben wird

  7. Alle Inhalte, die zwischen <<'EOT'und <newline>EOT<newline>jetzt an die nowdoc-Ausgabe angehängt werden

  8. EOTBeendet den NowDOC, wodurch eine temporäre NowDOC-Datei erstellt und an den aufrufenden catBefehl zurückgegeben wird. catgibt den nowdoc aus und gibt die Ausgabe an die erfasste interpolierte Zeichenfolge zurück

  9. ) schließt den auszuführenden Befehl ab

  10. "schließt die erfasste interpolierte Zeichenfolge ab. Der Inhalt der interpolierten Zeichenfolge wird sshals einzelnes Befehlszeilenargument zurückgegeben, das sshals Remote-Befehl zur Ausführung interpretiert wirduser@server

Wenn Sie die Verwendung externer Tools wie z. B. vermeiden catmöchten und zwei Anweisungen anstelle einer Anweisung verwenden readmöchten , verwenden Sie die integrierte Funktion mit einem Heredoc, um den SSH-Befehl zu generieren:

IFS='' read -r -d '' SSH_COMMAND <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT

ssh user@server "${SSH_COMMAND}"
Dejay Clayton
quelle
+1 eineinhalb Jahre später! :) wirklich klare Erklärung. gut gemacht
yaroslavTir
1
Für mich (und ich bin keineswegs eine "DevOps" -Person) hat das funktioniert (ich benutze Jenkins). Ich habe auch die Vorschläge "-t -t" und "-T" ausprobiert, bin jedoch auf Open-Stream-Probleme und Nichtausführungsprobleme gestoßen.
Ryan Crews
2 Jahre später wirklich hilfreich
Jack-Nie
+1 Tolle Erklärung. Aber wenn Sie das letzte Code-Snippet (IFS = '' *) zu einer Funktion zum Ausführen von Remote-Befehlen machen, wie würden Sie $ 1 an das IFS = '' * übergeben? Der Dozent scheint den Inhalt von 1 Dollar überhaupt zu erkennen.
Cristian Matthias Ambæk
1
@ mklement0 Sicher, Sie können Zeichenfolgen nach Bedarf umgehen, aber wer möchte den Aufwand, Skriptanweisungen ändern zu müssen, die Sie möglicherweise nur aus einem anderen Shell-Skript kopieren und einfügen, oder einen Stapelüberlauf? Die Eleganz der catLösung besteht auch darin, dass sie in einer einzigen (wenn auch zusammengesetzten) Anweisung ausgeführt wird und nicht dazu führt, dass temporäre Variablen die Shell-Umgebung verschmutzen.
Dejay Clayton
63

Ich füge diese Antwort hinzu, weil sie ein verwandtes Problem gelöst hat, das ich mit derselben Fehlermeldung hatte.

Problem : Ich hatte cygwin unter Windows installiert und bekam diesen Fehler:Pseudo-terminal will not be allocated because stdin is not a terminal

Lösung : Es stellte sich heraus, dass ich das OpenSh-Client-Programm und die Dienstprogramme nicht installiert hatte. Aus diesem Grund verwendete cygwin die Windows-Implementierung von ssh, nicht die cygwin-Version. Die Lösung bestand darin, das Paket openssh cygwin zu installieren.

Andrew Prock
quelle
10
Für mich stellte sich heraus, dass es eine weitere SSH-Implementierung im PATH war:$ which ssh/cygdrive/c/Program Files (x86)/Git/bin/ssh
FelixJongleur42
und um opensshdies zu installieren, kann der Weg für Windows sein: superuser.com/a/301026/260710
Andreas Dietrich
Diese Lösung funktioniert bei mir. Nach der Installation von openssh ist das Problem behoben.
JDHAO
34

Die Warnmeldung Pseudo-terminal will not be allocated because stdin is not a terminal.ist darauf zurückzuführen, dass kein Befehl angegeben ist, sshwährend stdin von einem Here-Dokument umgeleitet wird. Aufgrund des Fehlens eines angegebenen Befehls als Argument wird sshzunächst eine interaktive Anmeldesitzung erwartet (die die Zuweisung eines Pty auf dem Remote-Host erfordern würde), muss dann jedoch erkennen, dass sein lokaler Standard kein Tty / Pty ist. Um sshdas stdin von einem Here-Dokument umzuleiten, muss normalerweise ein Befehl (z. B. /bin/sh) als Argument angegeben werden. In diesem sshFall wird standardmäßig keine pty auf dem Remote-Host zugewiesen.

Da keine Befehle ausgeführt werden müssen ssh, für die ein tty / pty (wie vimoder top) erforderlich ist -t, sshist der Wechsel zu überflüssig. Verwenden Sie einfach ssh -T user@server <<EOT ...oder ssh user@server /bin/bash <<EOT ...und die Warnung verschwindet.

Wenn <<EOFkeine Escape- oder einfach in Anführungszeichen gesetzten (dh <<\EOToder <<'EOT') Variablen im hier gezeigten Dokument von der lokalen Shell erweitert werden, bevor sie ausgeführt wird ssh .... Dies hat zur Folge, dass die Variablen im Dokument hier leer bleiben, da sie nur in der Remote-Shell definiert sind.

Wenn $REL_DIRalso sowohl für die lokale Shell zugänglich als auch für die Remote-Shell definiert werden soll, $REL_DIRmuss dies vor dem sshBefehl außerhalb des hier angegebenen Dokuments definiert werden ( Version 1 unten). oder, wenn <<\EOToder <<'EOT'verwendet wird, kann die Ausgabe des sshBefehls zugewiesen werden, REL_DIRwenn die einzige Ausgabe des sshBefehls an stdout von echo "$REL_DIR"innerhalb des hier mit Escapezeichen / einfachen Anführungszeichen versehenen Dokuments ( Version 2 unten) generiert wird .

Eine dritte Möglichkeit wäre, das hier gezeigte Dokument in einer Variablen zu speichern und diese Variable dann als Befehlsargument an ssh -t user@server "$heredoc"( Version 3 unten) zu übergeben.

Und zu guter Letzt wäre es keine schlechte Idee zu überprüfen, ob die Verzeichnisse auf dem Remote-Host erfolgreich erstellt wurden (siehe: Überprüfen Sie, ob die Datei auf dem Remote-Host mit ssh vorhanden ist ).

# version 1

unset DEP_ROOT REL_DIR
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"

ssh localhost /bin/bash <<EOF
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
#echo "$REL_DIR"
exit
EOF

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"


# version 2

REL_DIR="$(
ssh localhost /bin/bash <<\EOF
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
exit
EOF
)"

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"


# version 3

heredoc="$(cat <<'EOF'
# -onlcr: prevent the terminal from converting bare line feeds to carriage return/line feed pairs
stty -echo -onlcr
DEP_ROOT='/tmp'
datestamp="$(date +%Y%m%d%H%M%S)"
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
   echo "creating the root directory" 1>&2
   mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
stty echo onlcr
exit
EOF
)"

REL_DIR="$(ssh -t localhost "$heredoc")"

scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"
zanco
quelle
5
Vielen Dank für die sehr detaillierte Erklärung, was dieser Fehler bedeutet und warum er bei Verwendung eines Heredocs auftritt. Dies hat mir geholfen, ihn tatsächlich zu verstehen, anstatt ihn nur zu umgehen.
Dan
29

Alle relevanten Informationen sind in den vorhandenen Antworten enthalten, aber lassen Sie mich eine pragmatische Zusammenfassung versuchen :

tl; dr:

  • Übergeben Sie die auszuführenden Befehle mit einem Befehlszeilenargument :
    ssh jdoe@server '...'

    • '...' Zeichenfolgen können mehrere Zeilen umfassen, sodass Sie Ihren Code auch ohne Verwendung eines Here-Dokuments lesbar halten können:
      ssh jdoe@server ' ... '
  • Übergeben Sie die Befehle NICHT über stdin , wie dies bei Verwendung eines Here-Dokuments der Fall ist :
    ssh jdoe@server <<'EOF' # Do NOT do this ... EOF

Das Übergeben der Befehle als Argument funktioniert unverändert und:

  • Das Problem mit dem Pseudo-Terminal wird nicht einmal auftreten.
  • Sie benötigenexit am Ende Ihrer Befehle keine Anweisung , da die Sitzung automatisch beendet wird, nachdem die Befehle verarbeitet wurden.

Kurz gesagt: Das Übergeben von Befehlen über stdin ist ein Mechanismus, der im Widerspruch zum sshDesign steht und Probleme verursacht, die dann umgangen werden müssen.
Lesen Sie weiter, wenn Sie mehr wissen möchten.


Optionale Hintergrundinformationen:

sshDer Mechanismus zum Akzeptieren von Befehlen zur Ausführung auf dem Zielserver ist ein Befehlszeilenargument : Der letzte Operand (Nichtoptionsargument) akzeptiert eine Zeichenfolge, die einen oder mehrere Shell-Befehle enthält.

  • Standardmäßig werden diese Befehle unbeaufsichtigt in einer nicht interaktiven Shell ohne Verwendung eines (Pseudo-) Terminals ausgeführt (Option -Tist impliziert), und die Sitzung wird automatisch beendet, wenn der letzte Befehl die Verarbeitung beendet hat.

  • Für den Fall, dass Ihre Befehle eine Benutzerinteraktion erfordern , z. B. das Antworten auf eine interaktive Eingabeaufforderung, können Sie explizit die Erstellung eines Pty (Pseudo-Tty) anfordern , eines Pseudo-Terminals, das die Interaktion mit der Remote-Sitzung mithilfe der -tOption ermöglicht. z.B:

    • ssh -t jdoe@server 'read -p "Enter something: "; echo "Entered: [$REPLY]"'

    • Beachten Sie, dass die interaktive readEingabeaufforderung nur mit einem Pty korrekt funktioniert, sodass die -tOption benötigt wird.

    • Die Verwendung eines Pty hat einen bemerkenswerten Nebeneffekt: stdout und stderr werden kombiniert und beide über stdout gemeldet ; Mit anderen Worten: Sie verlieren die Unterscheidung zwischen regulärer und Fehlerausgabe. z.B:

      • ssh jdoe@server 'echo out; echo err >&2' # OK - stdout and stderr separate

      • ssh -t jdoe@server 'echo out; echo err >&2' # !! stdout + stderr -> stdout

sshWenn dieses Argument nicht vorhanden ist, wird eine interaktive Shell erstellt - auch wenn Sie Befehle über stdin senden. Hier beginnt das Problem:

  • Bei einer interaktiven Shell wird sshnormalerweise standardmäßig ein pty (Pseudo-Terminal) zugewiesen, es sei denn, sein Standard ist nicht mit einem (realen) Terminal verbunden.

    • Das Senden von Befehlen über stdin bedeutet, dass sshstdin nicht mehr mit einem Terminal verbunden ist, sodass kein pty erstellt wird, und ssh warnt Sie entsprechend :
      Pseudo-terminal will not be allocated because stdin is not a terminal.

    • Auch die -tOption, deren ausdrücklicher Zweck ist auf Anfrage Schaffung eines pty, ist nicht genug , um in diesem Fall : Sie werden die gleiche Warnung.

      • Etwas seltsamerweise müssen Sie dann die Option verdoppeln-t , um die Erstellung eines Pty zu erzwingen: ssh -t -t ...oder ssh -tt ...zeigt, dass Sie es wirklich ernst meinen .

      • Vielleicht liegt der Grund dafür, dass dieser sehr bewusste Schritt erforderlich ist, darin, dass die Dinge möglicherweise nicht wie erwartet funktionieren . Unter macOS 10.12 funktioniert beispielsweise das scheinbare Äquivalent des obigen Befehls, der die Befehle über stdin bereitstellt und verwendet -tt, nicht ordnungsgemäß. Die Sitzung bleibt hängen, nachdem auf die readEingabeaufforderung reagiert wurde :
        ssh -tt jdoe@server <<<'read -p "Enter something: "; echo "Entered: [$REPLY]"'


In dem unwahrscheinlichen Fall, dass die Befehle, die Sie als Argument übergeben möchten, die Befehlszeile für Ihr System zu lang machen (wenn sich ihre Länge nähert getconf ARG_MAX- siehe diesen Artikel ), sollten Sie den Code zuerst in Form eines Skripts auf das ferne System kopieren ( Verwenden Sie z. B. scp) und senden Sie dann einen Befehl, um dieses Skript auszuführen.

Verwenden Sie zur Not -Tdie Befehle und geben Sie sie über stdin mit einem abschließenden exitBefehl ein. Beachten Sie jedoch, dass die Verwendung -ttanstelle von -Tmöglicherweise nicht funktioniert , wenn Sie auch interaktive Funktionen benötigen .

mklement0
quelle
1
Dies funktionierte perfekt. Auf diese Weise zeigte das Terminal jeden Befehl an, der über ssh gesendet wurde.
Mark E
1
"Verdoppeln Sie die Option -t, um die Erstellung eines Pty zu erzwingen: ssh -t -t ... oder ssh -tt ... zeigt, dass Sie es wirklich ernst meinen." - ha, ha - danke lustig, aber auch ernst - ich kann mich nicht um das Doppelte kümmern. Ich weiß nur, wenn ich ein einzelnes t einsetze, funktioniert es nicht
DavidC
22

Ich weiß nicht, woher der Hang kommt, aber das Umleiten (oder Weiterleiten) von Befehlen in ein interaktives SSH ist im Allgemeinen ein Rezept für Probleme. Es ist robuster, den Befehl zum Ausführen als letztes Argument zu verwenden und das Skript in der ssh-Befehlszeile zu übergeben:

ssh user@server 'DEP_ROOT="/home/matthewr/releases"
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR=$DEP_ROOT"/"$datestamp
if [ ! -d "$DEP_ROOT" ]; then
    echo "creating the root directory"
    mkdir $DEP_ROOT
fi
mkdir $REL_DIR'

(Alles in einem riesigen, 'mehrzeiligen Befehlszeilenargument).

Die Pseudo-Terminal-Nachricht ist darauf zurückzuführen, dass Sie -tssh auffordern, zu versuchen, die auf dem Remotecomputer ausgeführte Umgebung für die dort ausgeführten Programme wie ein tatsächliches Terminal aussehen zu lassen. Ihr SSH-Client lehnt dies ab, da seine eigene Standardeingabe kein Terminal ist und er daher keine Möglichkeit hat, die speziellen Terminal-APIs vom Remote-Computer an Ihr eigentliches Terminal am lokalen Ende weiterzuleiten.

Was wollten Sie überhaupt erreichen -t?

hmakholm hat Monica verlassen
quelle
1
Die Option -t war ein Versuch, das Psuedo-Terminalproblem zu beheben (es hat nicht funktioniert). Ich habe Ihre Lösung ausprobiert, sie hat das Pseudo-Terminal-Ding beseitigt, aber jetzt hängt es nur noch ...
Matthew
4
@Henning: Können Sie bitte die Nachteile der Umleitung oder Weiterleitung in ein interaktives SSH erläutern oder einen Link bereitstellen?
Isaac Kleinman
etwas spät aber: hier brauchst du kein Pseudo-Terminal, also benutze -Tstattdessen die Option .
Florian Castellane
6

Nachdem ich viele dieser Antworten gelesen hatte, dachte ich, ich würde meine resultierende Lösung teilen. Alles, was ich hinzugefügt habe, ist /bin/bashvor dem Heredoc und es gibt keinen Fehler mehr.

Benutze das:

ssh user@machine /bin/bash <<'ENDSSH'
   hostname
ENDSSH

Stattdessen (gibt Fehler):

ssh user@machine <<'ENDSSH'
   hostname
ENDSSH

Oder benutze dies:

ssh user@machine /bin/bash < run-command.sh

Stattdessen (gibt Fehler):

ssh user@machine < run-command.sh

ZUSÄTZLICH :

Wenn Sie weiterhin eine interaktive Remote-Eingabeaufforderung wünschen, z. B. wenn das Skript, das Sie remote ausführen, Sie zur Eingabe eines Kennworts oder anderer Informationen auffordert, da Sie in den vorherigen Lösungen die Eingabeaufforderungen nicht eingeben können.

ssh -t user@machine "$(<run-command.sh)"

Und wenn Sie auch die gesamte Sitzung in einer Datei protokollieren möchten logfile.log:

ssh -t user@machine "$(<run-command.sh)" | tee -a logfile.log
Wadih M.
quelle
0

Ich hatte unter Windows den gleichen Fehler mit emacs 24.5.1, um über / ssh: user @ host eine Verbindung zu einigen Unternehmensservern herzustellen. Was mein Problem gelöst hat, war, die Variable "tramp-default-method" auf "plink" zu setzen und jedes Mal, wenn ich eine Verbindung zu einem Server herstelle, das ssh-Protokoll zu deaktivieren. Sie müssen PuTTYs plink.exe installiert haben, damit dies funktioniert.

Lösung

  1. Mx customize-variable (und drücke dann die Eingabetaste)
  2. tramp-default-method (und drücken Sie dann erneut die Eingabetaste)
  3. In das Textfeld setzen Sie plink und dann Apply and Save the buffer
  4. Immer wenn ich versuche, auf einen Remote-Server zuzugreifen, verwende ich jetzt Cxf / user @ host: und gebe dann das Passwort ein. Die Verbindung wird jetzt unter Emacs unter Windows korrekt zu meinem Remote-Server hergestellt.
Miguel mietet
quelle
-3

ssh -t foobar @ localhost yourscript.pl

mxftw
quelle
2
Das OP verwendet -tauch, aber in ihrem spezifischen Szenario ist das nicht genug, was die Frage zunächst veranlasste.
mklement0