由 neevop 十二月 14, 2022
常见误区
-
使用管道符传入明文ssh密码:
echo password | ssh user@host
这种做法并行不通。
实现脚本内ssh
, scp
自动验证密码
-
方法 1:使用 expect 使用密码而不是密钥来执行 ssh
我们可以利用 expect 以自动方式提供密码,而无需在 shell 脚本中提示用户。当涉及到需要用户输入的自动化时,Expect 是一个非常方便的工具。尽管缺点是任何人都可以打开脚本并检查密码,因为密码是纯文本格式。
#!/usr/bin/expect set USER [lindex $argv ] set HOST [lindex $argv 1] set PWD [lindex $argv 2] log_file /var/log/ssh_tmp.log set timeout 30 log_user 1 set send_slow {1 .01} send_log "Connecting to $HOST using $USER user\n" eval spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o Connecttimeout =30 "$USER\@$HOST" expect { timeout { send_user "timeout while connecting to $HOST\n"; exit } "*No route to host*" { send_user "$HOST not reachable\n"; exit } "*assword: " { send -s $PWD\r } } expect { timeout { send_user "timeout waiting for prompt\n"; exit } "*]#" { send_user "Login successful to $HOST\n" } } send "hostname\r"
-
方法 2:使用 sshpass 为 SSH 提供密码
sshpass
是一个实用程序,旨在使用称为“键盘交互”密码身份验证的模式运行 ssh,但处于非交互模式。此 rpm 作为 EPEL 存储库的一部分提供,不需要密钥即可执行 SSH。# for debian/ubuntu sudo apt-get install sshpass # for centos sudo yum install sshpass
示例:
sshpass -p "your_password" ssh -o StrictHostKeyChecking=no user@host
注意:
sshpass -f
传递参数时,还可以从文件中读取密码。如果执行命令,使用-f
可防止密码可见。存储密码的文件应具有安全权限。
-
方法 3:使用 Private Public passphrase 代替 password
SSH 密钥是大多数系统的首选。它更不容易意外泄漏,因此非常适合安全。他们还鼓励基于身份的身份验证,因为 SSH 密钥通常绑定到创建它们的机器上,不会因为机器文件系统克隆或者网址变化而失效。
SSH 将公钥存储在
~/.ssh/id_rsa.pub
中,用于所有请求。生成新的密钥文件可以用如下命令,过程持续回车就可以:ssh-keygen -t rsa # or 基于密码的密钥对 ssh-keygen -t rsa -P "new_password"
需要将此公钥添加到要连接的服务器上的
~/.ssh/authorized_keys
文件中。有一个内置的 SSH 命令可以为您轻松完成此操作:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host # or ssh-copy-id user@host