对于使用rsync和SSH的脚本,只需输入一次密码


3

我正在尝试编写一个脚本,将网站推送到我的服务器,该网站文件在我的本地计算机上进行测试。

它现在可以工作,通过rsync更新服务器,然后ssh使服务器运行执行一些操作的脚本(即重新启动apache-网站使用WSGI)。

问题是我必须为服务器输入两次密码,这是我不喜欢的。

有没有办法使我只需要输入一次密码?我特别不想完全不必输入密码,因此我想有一些办法来解决这个ssh-key问题。


2
>不用ssh-key东西就可以做到这一点 –这正是这些键的作用。您不想执行此操作的任何特定原因?
slhck 2011年

我的意思是-这是一种廉价的解决方案-您可能可以使用SSH密钥来做到这一点,并且仅使脚本以root特权运行。
slhck 2011年

Answers:


6

在中查找-M-S选项ssh(1)。这个想法是打开到服务器的主连接,然后通过打开的套接字作为从属连接进行多次访问。另请参阅ControlMasterControlPathssh_config(5)手册。


1

我们大学有类似的复杂设置。要求用户使用密码登录。

最终,我了解了expect哪些可以实现此自动化。

就我而言,我使程序有点不可读,因此密码不会明显可见。

无论如何–我发现的第一个易于阅读的示例在这里

#!/usr/local/bin/expect
spawn  sftp  -b cmdFile user@yourserver.com
expect "password:"
send "shhh!\n"; 

想法是完全重新创建您的手动登录过程。因此,您需要事先知道脚本将遇到什么“问题”以及应该回答什么。

我的命令也是

spawn  ssh user@myserver.com

将字符串替换为expect您的情况中显示的内容-并根据需要输入答复。

因此,例如,如果您必须两次输入密码,请添加另一个

expect "password:"
send "my_super_secret_password\n"; 

不要忘记添加用于将网站放入脚本中的命令;)它看起来像:

expect "prompt:"
send "update my website\n"

0

还有一个类似的问题,您可以在这里找到另一个描述性答案。

为了以防万一,我rsync按照Kusalananda的建议,使用两个不同的过程制作了这个通用脚本:

#!/usr/bin/env bash

REMOTEUSER=username
REMOTEHOST=hostname

mkdir -P ~/.ssh/ctl
ssh -nNf -o ControlMaster=yes -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir01/ $REMOTEUSER@$REMOTEHOST:/remotedir01/

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir02/ $REMOTEUSER@$REMOTEHOST:/remotedir02/

ssh -O exit -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.