用sshpass自动使用密码登陆ssh
有的服务器设置了ssh登录时必须使用密码(要么是既要使用密钥又要输入密码,要么是禁止使用密钥只能输入密码),此时,每次在终端ssh登陆、以及使用vscode的remote ssh功能连接服务器时,都要输入密码,很麻烦。用sshpass可以实现自动密码登陆远程ssh,能够解决这一问题。
[!CAUTION]
使用sshpass登陆服务器,需要在本地明文保存密码,会降低安全性。因此建议只在网络环境和使用者权限都安全的本地设备,上使用sshpass。如,不开放网络访问权限、设置了登录密码的个人电脑可以用sshpass,服务器上不建议使用sshpass。
安装方法(用Homebrew)
mac
mac上安装了Homebrew之后,可以用它来安装sshpass。
终端输入以下命令
brew search sshpass
brew info sshpass
brew install sshpass
如果按照上述操作,没有找到可安装的sshpass,或者找到了却无法安装, 可以使用下面的方法安装:
brew tap esolitos/ipa
brew install esolitos/ipa/sshpass
验证SSHpass安装
sshpass # 查看帮助信息
sshpass -V # 查看版本信息
如果看到了SSHpass的帮助信息和版本信息,那么就说明sshpass已经成功安装。
Ubuntu
apt-get install sshpass
centos
yum -y install sshpass
源码包安装
上https://sourceforge.net/projects/sshpass/files/sshpass/ 找最新版本的源码下载链接
wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz # 换成最新版本的下载链接
tar xvzf sshpass-1.05.tar.gz
cd sshpass-1.05.tar.gz
./configure
make
make install
使用方法
用密码登陆
不建议用此法,容易泄漏秘密
sshpass -f <密码> ssh <host名>
# 或
sshpass -p <密码> ssh <username>@<ip> -p 22
用存放密码的文件登陆
sshpass -f <存放密码的文件的路径> ssh <host名>
# 或
sshpass -f <存放密码的文件的路径> ssh <username>@<ip> -p 22
<存放密码的文件的路径>
中只写一行内容,就是密码的明文。
为安全起见,建议设置改文件为只有自己可读写:
chmod 600 ~/.ssh/password-file
免密登陆配置
为了能够ssh <host别名>
自动使用密码登陆服务器,以及vscode的remote ssh功能能够自动加载~/.ssh/config
并自动使用密码登陆服务器,需要把sshpass登陆服务器配置到~/.ssh/config
里面。
首先,创建用来保存密码的文件~/.ssh/password-file
,在其中只写一行内容,就是密码。然后设置其为只有自己可读写:
chmod 600 ~/.ssh/password-file
免密登陆向公网开放的服务器
若某服务器host1向公网开放。
-
从外网登陆host1,既要使用密钥又要输入密码,或者禁止使用密钥只能输入密码。
-
从内网登陆host1时,只需密钥,无需密码。
要想登陆免密登陆host1,可以在本地的~/.ssh/config
配置:
# 先用sshpass免密登陆host0(和host1实际是同一台机器),再以此为跳板登陆host1
# host0用作跳板
Host host0
HostName <服务器的公网ip>
User <用户名>
# 如果需要使用密钥,才使用下面这行
IdentityFile ~/.ssh/id_rsa
# 从跳板host0登陆它自己
Host host1
HostName localhost
# 或写成
# HostName <服务器的内网ip>
User <用户名>
IdentityFile ~/.ssh/id_rsa
ProxyCommand sshpass -f ~/.ssh/password-file ssh host0 -W %h:%p
这样,就可以登陆host1时无需输入密码了
ssh host1
vscode的remote ssh功能连接服务器时,选择host1,也不用输入密码。
免密登陆跳板机再登陆内网服务器
若某服务器host2不向公网开放,需要先登陆host0进入内网,才能登陆host2。
-
从内网登陆host2时,只需密钥,无需密码。
-
从外网登陆host0时,既要使用密钥又要输入密码,或者禁止使用密钥只能输入密码。
那么,要想登陆免密登陆host2,可以在本地的~/.ssh/config
配置:
# 先用sshpass免密登陆host0,再以此为跳板登陆host2。
# 用作跳板
Host host0
HostName <跳板机的公网ip>
User <用户名>
# 如果需要使用密钥,才使用下面这行
IdentityFile ~/.ssh/id_rsa
# 从跳板登陆其他服务器
Host host2
HostName <其他服务器的内网ip>
User <用户名>
IdentityFile ~/.ssh/id_rsa
ProxyCommand sshpass -f ~/.ssh/password-file ssh host0 -W %h:%p
这样,就可以经由host0登陆host2时,就无需输入host0的密码了
ssh host2
vscode的remote ssh功能连接服务器时,选择host2,也不用输入密码。