ssh带登陆

本文介绍如何在命令行中带着密码登陆ssh,基于ubuntu 16.04 64bit系统。

本文内容适应于各种 CI 系统。

简化记录

1
2
3
4
5
6
sudo apt install sshpass

sshpass -p 123456 ssh latelee@192.168.28.131 -o StrictHostKeyChecking=no "echo hello > /tmp/foo"

sshpass -p 123456 scp -o StrictHostKeyChecking=no ../site.tar.bz2 latelee@192.168.28.131:/tmp/ || exit 1

使用sshpass

安装:

1
sudo apt install sshpass

使用格式:

1
2
sshpass -p <密码> ssh <用户名>@<IP或域名> -o StrictHostKeyChecking=no [在远程服务器执行的命令]

<>为必填项,[]为可选项。-o StrictHostKeyChecking=no表示不检查key,因为首次登陆时,会出现:

1
2
3
The authenticity of host 'XXX (120.XX.237.XX)' can't be established.
ECDSA key fingerprint is SHA256:hBonkc1ZLbAPrT1HB47asdf3CjvLSKN4PGIcS5BSSDX3YY.
Are you sure you want to continue connecting (yes/no)?

此时,必须手动输入yes或no才能输入密码。

使用示例:

1
sshpass -p 123456 ssh latelee@192.168.28.131 -o StrictHostKeyChecking=no "echo hello > /tmp/foo"

注:使用复杂的密码(有特殊符号)测试时,发现-p后的密码需要使用双引号即-p "1234"

密码使用环境变量保存,不在命令中出现:

1
2
export SSHPASS="123456" # 设置环境变量,SSHPASS为sshpass固定的变量
sshpass -e ssh latelee@192.168.28.131 -o StrictHostKeyChecking=no "echo hello123 > /tmp/foo" # -e表示从环境变量中读取

如果执行的命令出错,会有相应的提示(命令找不到,或命令使用非法)。如下:

1
2
sshpass -p 123456 ssh latelee@192.168.28.131 -o StrictHostKeyChecking=no "echo111 hello > /tmp/foo"
bash: echo111: command not found

即主机上有错误命令的提示,
在命令最后添加 >/dev/null 2>&1,将错误信息重定向到/dev/null中。则在主机不会显示。

1
sshpass -p 123456 ssh latelee@192.168.28.131 -o StrictHostKeyChecking=no "echo111 hello > /tmp/foo  >/dev/null 2>&1"

注:命令执行出错会返回错误码,使用echo $?可查看。
如果已用 ssh 登录过系统,则不需要再带 -o StrictHostKeyChecking=no 选项。
如果已保存了密钥,可不需要带-p <密码>
在 sshpass 中执行的命令可带环境变量,但该环境变量只有保存到运行 sshpass 命令所在的主机中才生效。

下载:https://pkgs.org/download/sshpass
编译安装:

1
2
3
4
git clone git://github.com/kevinburke/sshpass.git
cd sshpass
./configure --prefix=/home/topter/tools/sshpass
make && make install