rsync以“stdin is not tty”消息退出

时间:2011-08-15 07:21:53

标签: ssh rsync tty

我想将rsync用于我有SSH访问权限的远程服务器。我使用以下命令:

  

rsync -e'ssh -p 22222'-rtz --delete content_dir / user@example.com:/ home / user / public_html

输入命令后,它会要求输入远程位置的密码。当我输入它时,它会以消息

退出
  

stdin:不是tty

如何为rsync提供密码?当我在shell脚本中使用它时,建议的方法也应该有用。

4 个答案:

答案 0 :(得分:19)

您需要添加:

  

[-z“$ PS1”]&&返回

到你家里的.bashrc的开头。

答案 1 :(得分:2)

此处接受密码 ,因为您已经说明了操作确实发生了。

错误消息“stdin:is not tty”是由于服务器上的启动脚本中的某些内容尝试处理应该仅针对交互式登录执行的操作(当您将ssh直接连接到服务器等时)

答案 2 :(得分:1)

[ -z "$PS1" ] && return解决了这个问题,但它检查提示字符串长度是否等于零,如果确实如此,则退出。虽然$ PS1不会在非交互式shell中设置,但$ PS1长度为零并不意味着shell不是交互式的。

更好的方法是使用$-检查shell的当前选项。例如[[ $- != *i* ]] && return

答案 3 :(得分:0)

如果一个简单的return没有完成这项工作,这是另一种从this blog article采取的方法:

if `tty -s`; then
 mesg n
fi
  • tty -s检查是否附加了TTY(-s告诉它静默地执行此操作,并使用相应的返回码退出)。 tty返回附加的tty(例如“/ dev / pts / 1”)。这应该比检查一些shell变量更安全;)
  • mesg控制对终端的写访问权限(msg n不允许写入(在我们的情况下不存在)终端),因此需要一个终端写入。

在某些系统上(在我的案例中是Debian Jessie,但也有关于Ubuntu的报告)mesg n 1 在{{1}中无条件设置}或~/.bashrc。因此,如果它存在,那可能是罪魁祸首。

与其他示例一样,您当然可以将其设为一行:~/.profile。没有人阻止你把两者结合起来:

[[ $(tty -s ) ]] && mesg n

顺便说一下:根据链接的文章,这个片段应该转到你连接(“远程”)的机器的if [[ $(tty -s ) ]]; then mesg n else return fi - 所以如果那是.bashrc ,这应该在johndoe@somehost的{​​{1}}开头应用。在我的情况下,我也只是在“调用主机”上应用了这个更改后删除了消息。

PS:同时检查/home/johndoe/.bashrc是否有独立somehost命令(在我的情况下确实如此)。如果是,请将其包裹起来。

1: .profile用于防止计算机上的其他用户写入您当前的终端设备,这本身就是一件好事 - 但对某些设备没有帮助{ {1}}工作;)