2011-08-15 15 views
8

Chcę użyć rsync do mojego zdalnego serwera, dla którego mam dostęp SSH. Używać następujące polecenia:rsync wychodzi z komunikatem "stdin is not a tty"

rsync -E 'ssh -p 22222' -rtz --delete content_dir/[email protected]/home/user/public_html

Po wprowadzeniu polecenia , prosi o podanie hasła do zdalnej lokalizacji. Po wpisaniu go, to wychodzi z komunikatem,

stdin: nie jest tty

Jak mogę podać hasło do rsync? Sugerowana metoda powinna również działać, gdy używam jej w skrypcie powłoki.

+0

Najwyraźniej robi to, co ma robić. Przesyłanie plików przebiegło pomyślnie. Ale jaki jest komunikat o błędzie i czy powinienem się tym przejmować? –

Odpowiedz

2

Hasło jest akceptowane tutaj , ponieważ sam stwierdziłeś, że operacja się zdarzyła.

Komunikat o błędzie "stdin: is not a tty" jest spowodowany przez coś w skrypcie startowym na serwerze, który próbuje przetworzyć działanie, które powinno się zdarzyć tylko w przypadku interaktywnych loginów (gdy łączysz się z ssh bezpośrednio na serwerze, itp.).

18

Trzeba dodać:

[-z "$ PS1"] & & powrotnej

do beginig z .bashrc, który znajduje się w głównym katalogu.

+2

Czy możesz wyjaśnić, co tak naprawdę robi? Do czego służy [-z "$ PS1"]? – rooby

+1

@rooby, to polecenie sprawdza, czy powłoka działa interaktywnie. Jeśli tak, natychmiast wychodzi. Ma to sens, ponieważ elementy w pliku konfiguracyjnym bash nie są potrzebne w przypadku procesów nieinteraktywnych, takich jak rsync. –

1

[ -z "$PS1" ] && return rozwiązuje problem, ale sprawdza, czy ciąg znaków ma długość równą zeru, a następnie kończy. Chociaż $ PS1 nie zostanie ustawione w nieinteraktywnej powłoce, $ PS1 ma zerową długość, nie oznacza to ostatecznie, że powłoka nie jest interaktywna.

Lepszym rozwiązaniem jest sprawdzenie bieżących opcji powłoki za pomocą $-. Na przykład [[ $- != *i* ]] && return.

0

W przypadku prosta return nie wykonać zadanie, oto kolejny podejście od this blog article:

if `tty -s`; then 
mesg n 
fi 
  • tty -s sprawdza czy istnieje TTY załączeniu (the -s mówi to zrobić tak cicho i po prostu wyjdź z odpowiednim kodem powrotu). tty zwraca załączone tty (np. "/ Dev/pts/1"). To powinno być bezpieczniejsze niż sprawdzanie zmiennej powłoki;)
  • mesg kontroluje dostęp do zapisu do twojego terminala (msg n uniemożliwia zapisywanie do (w naszym przypadku nieistniejącego) terminala), a zatem wymaga obecności.

W niektórych systemach (w moim przypadku Debiana Jessie, ale istnieją również doniesienia na Ubuntu) mesg n ustawiony jest bezwarunkowo albo ~/.bashrc lub ~/.profile. Więc jeśli istnieje w ten sposób, może to być winowajcą.

Podobnie jak w przypadku innych przykładów, można oczywiście utworzyć jednolinijkową: [[ $(tty -s) ]] && mesg n. I nikt nie trzyma cię z połączenia dwóch:

if [[ $(tty -s) ]]; then 
    mesg n 
else 
    return 
fi 

Btw: Zgodnie z połączonej artykuł, fragment ten powinien udać się do .bashrc maszyny podłączeniu do („Remote”) - więc jeśli to [email protected] , powinno to być stosowane na początku /home/johndoe/.bashrc na somehost. W moim przypadku pozbyłem się wiadomości po zastosowaniu tej zmiany również na "hoście wywołującym".

PS: Sprawdź także .profile, jeśli ma autonomiczną komendę msg n (w moim przypadku). Jeśli tak, zapisz to.


1:mesg n jest stosowany w celu zapobiegania innym użytkownikom na piśmie maszynowym do bieżącego urządzenia końcowego, która per se jest dobrą rzeczą - ale nie jako jakiegoś rsync pracy;)