使用脚本自动inputSSH密码
我需要创build一个自动input密码给OpenSSH ssh
客户端的脚本。
假设我需要使用密码a1234b
进入myname@somehost
SSH。
我已经试过了…
#~/bin/myssh.sh ssh myname@somehost a1234b
…但这不起作用。
我怎样才能得到这个function到脚本?
首先你需要安装sshpass 。
- Ubuntu / Debian:
apt-get install sshpass
- Fedora / CentOS:
yum install sshpass
- Arch:
pacman -S sshpass
例:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
自定义端口示例:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400
使用公钥authentication: https : //help.ubuntu.com/community/SSH/OpenSSH/Keys
在源主机上只运行一次:
ssh-keygen -t rsa # ENTER to every field ssh-copy-id myname@somehost
这一切,之后,你将能够做到没有密码的SSH。
找了几个月的问题的答案后,我终于find了一个真正的最佳解决scheme:写一个简单的脚本。
#!/usr/bin/expect set timeout 20 set cmd [lrange $argv 1 end] set password [lindex $argv 0] eval spawn $cmd expect "assword:" send "$password\r"; interact
把它放到/usr/bin/exp
,然后你可以使用:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
完成!
你可以使用期望的脚本。 我有一段时间没写过,但应该看起来如下。 你需要用#!/ usr / bin / expect来编写脚本
#!/usr/bin/expect -f spawn ssh HOSTNAME expect "login:" send "username\r" expect "Password:" send "password\r" interact
变体一
sshpass -p PASSWORD ssh USER@SERVER
变体二
#!/usr/bin/expect -f spawn ssh USERNAME@SERVER "touch /home/user/ssh_example" expect "assword:" send "PASSWORD\r" interact
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password... echo "echo YerPasswordhere" > /tmp/1 chmod 777 /tmp/1 # sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds. export SSH_ASKPASS="/tmp/1" export DISPLAY=YOURDOINGITWRONG setsid ssh root@owned.com -p 22
参考: https : //www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card
我得到这个工作如下
.ssh / config被修改,以消除是/否提示 – 我在防火墙后面,所以我不担心伪装的SSH密钥
host * StrictHostKeyChecking no
创build一个期望的响应文件,即answer.expect
set timeout 20 set node [lindex $argv 0] spawn ssh root@node service hadoop-hdfs-datanode restart expect "*?assword { send "password\r" <- your password here. interact
创build你的bash脚本,只需在文件中调用expect
#!/bin/bash i=1 while [$i -lt 129] # a few nodes here expect answer.expect hadoopslave$i i=[$i + 1] sleep 5 done
获取128个hadoop datanodes刷新与新的configuration – 假设您正在使用NFS挂载的hadoop / conf文件
希望这可以帮助别人 – 我是一个Windows数字,这花了我大约5个小时弄清楚!
我有一个更好的解决scheme,包括login您的帐户,而不是更改为root用户。 这是一个bash脚本
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
@abbotto的答案不适合我,不得不做一些不同的事情:
- yum install sshpass改为 – rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
- 使用sshpass的命令改为 – sshpass -p“pass”ssh user @ mysite -p 2122
要通过shell脚本连接远程机器,请使用以下命令:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
其中IPADDRESS
, USERNAME
和PASSWORD
是需要在脚本中提供的input值,或者如果我们想在运行时提供“读取”命令。
要让密钥交换在拇指驱动器上工作,必须将私钥复制到驱动器中,并在ssh命令中指定它(以避免使用本地帐户私钥),例如:
ssh -i id_rsa host
或者,你可以使用expect(这是一个独立的shell脚本)。 这是以前关于SSH和期望的问题 。
请注意,任何人都可以打开期望脚本并以纯文本forms查看login凭据。