rsync завершает работу с сообщением "stdin is tty" - PullRequest
8 голосов
/ 15 августа 2011

Я хочу использовать rsync для моего удаленного сервера, для которого у меня есть доступ по SSH. Я использую следующую команду:

rsync -e 'ssh -p 22222' -rtz - удалить content_dir / user@example.com: / home / user / public_html

После ввода команды запрашивается пароль для удаленного местоположения. Когда я набираю его, он выходит с сообщением

stdin: это не tty

Как мне ввести пароль для rsync? Предложенный метод также должен работать, когда я использую его в сценарии оболочки.

Ответы [ 4 ]

19 голосов
/ 10 марта 2013

Вам необходимо добавить:

[-z "$ PS1"] && return

к началу .bashrc, которое находится в вашем домашнем каталоге.

2 голосов
/ 01 сентября 2011

Пароль здесь принимается , поскольку вы заявили, что операция действительно происходит.

Сообщение об ошибке "stdin: not tty" вызвано чем-то всценарий запуска на вашем сервере, пытающийся обработать действие, которое должно происходить только для интерактивных входов в систему (когда вы подключаетесь через ssh напрямую к серверу и т. д.).

1 голос
/ 21 августа 2014

[ -z "$PS1" ] && return решает проблему, но проверяет, равна ли длина строки приглашения нулю, и если это так, то завершается.Хотя $ PS1 не будет установлен в неинтерактивной оболочке, нулевая длина $ PS1 в конечном счете не означает, что оболочка не является интерактивной.

Лучшим подходом является проверка текущих параметров оболочки с использованием * 1004.*.Например [[ $- != *i* ]] && return.

0 голосов
/ 05 апреля 2016

В случае, если простой return не справляется с работой, вот еще один подход, взятый из этой статьи блога :

if `tty -s`; then
 mesg n
fi
  • tty -s проверяет, есть липрикрепленный TTY (-s говорит ему сделать это молча и просто завершиться с соответствующим кодом возврата)tty возвращает вложенный tty (например, "/ dev / pts / 1").Это должно быть безопаснее, чем проверка некоторой переменной оболочки;)
  • mesg контролирует доступ на запись к вашему терминалу (msg n запрещает запись в (в нашем случае несуществующий) терминал) и, следовательно, требует одногоприсутствовать.

В некоторых системах (в моем случае это Debian Jessie, но есть и отчеты об Ubuntu) mesg n 1 устанавливается безоговорочнов ~/.bashrc или ~/.profile.Поэтому, если так и существует, это может быть виновником.

Как и в других примерах, вы, конечно, можете сделать это однострочным: [[ $(tty -s ) ]] && mesg n.И никто не мешает вам объединить их:

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

Кстати: согласно связанной статье, этот фрагмент должен идти к .bashrc машины, которую вы подключаете к ("remote ") - так что если это johndoe@somehost, это должно быть применено в начале /home/johndoe/.bashrc на somehost.В моем случае я избавился от сообщения только после того, как применил это изменение к «вызывающему хосту».

PS: Также проверьте .profile, если оно имеет отдельную команду msg n (это было в моем случае).Если это так, оберните его там.


1: mesg n используется, чтобы запретить другим пользователям на машине выполнять запись в ваше текущее оконечное устройство, что само по себеэто хорошо, но не полезно для какой-то rsync работы;)

...