rsync beendet die Meldung "stdin is not a tty"

8

Ich möchte rsync zu meinem entfernten Server benutzen, für den ich SSH-Zugang habe. Ich benutze den folgenden Befehl:

  

rsync -e 'ssh -p 22222' -rtz --Löschen content_dir / [email protected]: / home / user / public_html

Nach Eingabe des Befehls wird nach dem Passwort für den entfernten Standort gefragt. Wenn ich es eintippe, wird es mit der Nachricht

beendet
  

stdin: ist kein tty

Wie gebe ich das Passwort für rsync ein? Die vorgeschlagene Methode sollte auch funktionieren, wenn ich sie in einem Shell-Skript verwende.

    
Prasanna Natarajan 15.08.2011, 07:21
quelle

4 Antworten

18

Sie müssen hinzufügen:

  

[-z "$ PS1"] & amp; & amp; zurückgeben

zum Anfang von .bashrc, das sich in Ihrem Home-Verzeichnis befindet.

    
Josh C Josh C 10.03.2013 13:04
quelle
2

Das Passwort wird akzeptiert, da Sie selbst angegeben haben, dass die Operation ausgeführt wird.

Die Fehlermeldung "stdin: is not a tty" ist auf etwas im Startskript auf Ihrem Server zurückzuführen, das versucht, eine Aktion zu verarbeiten, die nur für interaktive Logins passieren soll (wenn Sie eine Verbindung mit ssh direkt zum Server herstellen, usw.) .

    
Zoe J Hendrickse 01.09.2011 14:22
quelle
1

[ -z "$PS1" ] && return löst das Problem, aber es prüft, ob die Länge der Eingabeaufforderungszeichenfolge gleich Null ist, und wenn dies der Fall ist, wird es beendet. Obwohl $ PS1 nicht in einer nicht interaktiven Shell festgelegt wird, bedeutet $ PS1 mit der Länge Null nicht, dass die Shell nicht interaktiv ist.

Besser ist es, die aktuellen Optionen der Shell mit $- zu überprüfen. Zum Beispiel [[ $- != *i* ]] && return .

    
Boris D. Teoharov 21.08.2014 16:52
quelle
0

Falls ein einfacher return den Job nicht macht, ist hier ein anderer Ansatz aus Dieser Blogartikel :

%Vor%
  • tty -s prüft, ob ein TTY angehängt ist (der -s sagt ihm, dass er es stillschweigend tun soll und beendet den Vorgang mit dem entsprechenden Return-Code). tty gibt das angehängte tty zurück (z. B. "/ dev / pts / 1"). Dies sollte sicherer sein als einige Shell-Variablen zu überprüfen;)
  • mesg steuert den Schreibzugriff auf Ihr Terminal ( msg n erlaubt kein Schreiben an das (in unserem Fall nicht existierende) Terminal) und erfordert daher, dass eines vorhanden ist.

Auf einigen Systemen (in meinem Fall Debian Jessie, aber es gibt auch Berichte über Ubuntu) mesg n 1 ist unbedingt in ~/.bashrc oder% co_de gesetzt %. Wenn es also so ist, könnte dies der Schuldige sein.

Wie bei den anderen Beispielen können Sie das natürlich als Einzeiler machen: ~/.profile . Und niemand hält Sie davon ab, die beiden zu kombinieren:

%Vor%

Btw: Laut dem verlinkten Artikel sollte dieses Fragment auf die [[ $(tty -s ) ]] && mesg n der Maschine gehen, die du mit verbunden hast (die "entfernte") - also wenn das .bashrc ist, sollte dies sein am Anfang von johndoe@somehost auf /home/johndoe/.bashrc angewendet. In meinem Fall habe ich die Nachricht nur losgeworden, nachdem ich diese Änderung auch auf den "rufenden Host" angewendet habe.

PS: Überprüfen Sie auch die somehost wenn sie einen eigenständigen .profile Befehl hat (in meinem Fall). Wenn dies der Fall ist, wickeln Sie es dort ein.

1: msg n wird verwendet, um zu verhindern, dass andere Benutzer auf dem Gerät auf Ihr aktuelles Endgerät schreiben, was an sich eine gute Sache ist - aber für einige mesg n nicht hilfreich job;)

    
Izzy 05.04.2016 06:36
quelle

Tags und Links