用sshpass自动使用密码登陆ssh

有的服务器设置了ssh登录时必须使用密码(要么是既要使用密钥又要输入密码,要么是禁止使用密钥只能输入密码),此时,每次在终端ssh登陆、以及使用vscode的remote ssh功能连接服务器时,都要输入密码,很麻烦。用sshpass可以实现自动密码登陆远程ssh,能够解决这一问题。

[!CAUTION]

使用sshpass登陆服务器,需要在本地明文保存密码,会降低安全性。因此建议只在网络环境和使用者权限都安全的本地设备,上使用sshpass。如,不开放网络访问权限、设置了登录密码的个人电脑可以用sshpass,服务器上不建议使用sshpass。

参考:如何在mac上安装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,也不用输入密码。