我想对我有 SSH 访问权限的远程服务器使用 rsync。我使用以下命令:
rsync -e 'ssh -p 22222' -rtz --delete content_dir/user@example.com:/home/user/public_html
输入命令后,它会询问远程位置的密码。当我输入它时,它会退出并显示消息,
标准输入:不是 tty
如何为 rsync 提供密码?当我在 shell 脚本中使用它时,建议的方法也应该有效。
您需要添加:
[ -z "$PS1" ] && 返回
到位于您的主目录中的 .bashrc 的开头。
正如您所说的那样,这里接受了密码,操作确实发生了。
错误消息“stdin: is not a tty”是由于服务器上的启动脚本中的某些内容试图处理只应在交互式登录时发生的操作(当您使用 ssh 直接连接到服务器等时)。
[ -z "$PS1" ] && return
解决了这个问题,但它检查提示字符串长度是否等于零,如果是则退出。尽管 $PS1 不会在非交互式 shell 中设置,但 $PS1 的长度为零并不最终意味着 shell 不是交互式的。
更好的方法是使用 . 检查 shell 的当前选项$-
。例如[[ $- != *i* ]] && return
.
如果一个简单return
的方法不起作用,这是从这篇博客文章中采取的另一种方法:
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无条件设置为~/.bashrc
或~/.profile
. 因此,如果它以这种方式存在,这可能是罪魁祸首。
与其他示例一样,您当然可以将其设为单行:[[ $(tty -s ) ]] && mesg n
. 没有人阻止您将两者结合起来:
if [[ $(tty -s ) ]]; then
mesg n
else
return
fi
顺便说一句:根据链接的文章,这个片段应该去.bashrc
你连接到的机器(“远程”) - 所以如果是johndoe@somehost
,这应该在开始时应用/home/johndoe/.bashrc
on somehost
。就我而言,我也只是在“呼叫主机”上应用了此更改后才删除了该消息。
PS:还要检查.profile
它是否有独立msg n
命令(在我的情况下是这样)。如果是这样,请将其包裹在那里。
1: mesg n
用于防止机器上的其他用户写入您当前的终端设备,这本身是一件好事——但对某些rsync
工作没有帮助;)