没有合适的资源?快使用搜索试试~ 我知道了~
首页用于shell脚本无交互的ssh自动登陆(转载)
资源详情
资源评论
资源推荐

12-3-27 用于shell脚本无交互的ssh自动登
1/2apt-blog.net/ssh_auto_login_in_shell_script
用于shell脚本无交互的ssh自动登
June 24, 2010
ssh连接远程主机时候询问密码,跟su、sudo命令的认行为一样,是不从stdin读入数据的,
据称是为安全考虑,但是有时候在脚本当中确实需要无人守值的登陆。
搜索一下不难找到类似的例子,使用expect来完成密码应答:
1
2
3
4
5
6
7
8
9
10
#!/bin/bah
auto_login_ssh () {
expect -c "set timeout -1;
spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3;
expect *assword:*;
send -- $1\r;
interact;";
auto_login_ssh passwd user@host
StrictHostKeyChecking=no参数让ssh认添加新主机的公钥指纹,也就不会出现出现是否继
续yes/no的提示了。
expect很不错,上述代码基本可以达到要求了,能够当翻墙用的ssh -D自动登陆,执行远程
命令等等,但是如果作为一个完全非交互的远程工具,应该说还一差,不能返回整个连接执行
过程是否成功。
使用expect后,程序的exit status是expect的,而不是ssh的,所以如果遇上连接不到的主
机、密码错误等情况,expect也一样是正常退出,$?为0,所以需要对expect的代码稍加修
改;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bah
auto_smart_ssh () {
expect -c "set timeout -1;
spawn ssh -o StrictHostKeyChecking=no $2 ${@:3;
expect {
*assword:* {send -- $1\r;
expect {
*denied* {exit 2;
eof
eof {exit 1;
"
return $?
auto_smart_ssh passwd user@host ls /var
echo -e "\n---Exit Status: $?"
这段expect的Tcl代码我已经尽量弄的好看点了(但还是挺难看),主要作用是,如果在输入
密码后遇到Permission denied,肯定是脚本提供的帐号有问题,就直接让expect按状态2退
出;而如果主机不可达No route to host, timed out, Connection refused等情况,ssh会直














安全验证
文档复制为VIP权益,开通VIP直接复制

评论0