技术解析

ssh 自动登陆脚本的问题
0
2021-06-21 06:07:57
idczone

打算做一个 ssh 免密登陆的脚本,用到了 expect 命令,但总是无法处理密码出错情况。代码如下:

ssh_copy_id_auto() {
    user=$1
    pass=$2
    host=$3
    key=$(echo ~/.ssh/id_rsa.pub)
expect << EOF
    set timeout 5;
    spawn ssh-copy-id -i $key [email protected]$host;
    expect {
        *(yes/no)?* { send yes\r; exp_continue; }
        *password:* { send $pass\r; exp_continue; }
        "*try again*" { exit 1; }   # 密码错误时应该直接退出,错误码 1
        eof         { exit 0; }
    };
EOF
}

无法匹配到密码出错的情况,不会退出,继续提示输入密码。 不知道是哪里的问题?


用 debug 解决了,expect -d
出错时的信息:\r\nPermission denied, please try again.\r\r\[email&password:
会先匹配到*password:*
怪不得有些例子里多用 -exact

为什么要重复造轮子?直接使用 sshpass 命令就行。

用密钥登录不好吗

shuttle mac 用这个 还不错~

用密钥登录不好吗

秘钥 + config 连 ip、端口都不用记

centos 源里没有,要自己编译,换个使用环境就麻烦了

是用的密钥,但用之前不要先拷过去?这个脚本就是做这个的,还可以批量拷贝
经常用别人的机器登陆服务器,
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服