2011-08-15 36 views
8

我想使用rsync连接到我具有SSH访问权限的远程服务器。我用下面的命令:rsync用“stdin不是tty”消息退出

的rsync -e '的ssh -p 22222' -rtz --delete content_dir/[email protected]:/ home/user中/的public_html

输入命令后它会要求输入远程位置的密码。当我键入它,它与消息退出,

标准输入:是不是tty

如何提供密码进行rsync?建议的方法应该也可以在shell脚本中使用它。

+0

显然它做它应该做的。文件传输成功发生。但是,什么是错误信息,我应该担心它吗? –

回答

2

密码在此处被接受,因为您已经声明自己的操作确实发生。

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

18

您需要添加:

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

到位于你的主目录的.bashrc的beginig。

+2

你能解释这实际上是什么吗? [-z“$ PS1”]做什么? – rooby

+1

@rooby,该命令检查shell是否以交互方式运行。如果是这样,它立即退出。这很有意义,因为bash配置文件中的东西对于非交互式进程而言不是必需的,例如rsync。 –

1

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

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

0

如果简单return不会做的工作,这里是从this blog article采取另一种方法:

if `tty -s`; then 
mesg n 
fi 
  • tty -s检查是否有该-s连接一个TTY(告诉它这样做,静静地,只是用适当的返回码退出)。 tty返回附加的tty(例如“/ dev/pts/1”)。这应该比检查某个shell变量更安全;)
  • mesg控制对您的终端的写入访问(msg n禁止写入(在我们的情况下不存在)终端),因此需要一个存在。

在一些系统上(在我的情况Debian的杰西,但也有报道在Ubuntu)mesg n在任一~/.bashrc~/.profile无条件设置。所以如果它以这种方式存在,这可能是罪魁祸首。

与其他示例一样,您当然可以制作一行代码:[[ $(tty -s) ]] && mesg n。没有人阻止你结合两个:顺便说一下

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

:根据链接的文章,该片段应到机器的.bashrc您连接(“远程”) - 所以,如果这是[email protected] ,这应该应用于/home/johndoe/.bashrc开始的somehost。在我的情况下,我只是在“调用主机”上应用此更改后才删除该消息。

PS:同时检查.profile是否有独立的msg n命令(它在我的情况下)。如果确实如此,请将其包裹。


1:mesg n用于防止机器写其他用户当前的终端设备,这本身是一件好事 - 但不适用于某些rsync工作有帮助;)