由于经常需要登录一些远程的服务器,每次都需要将密码重输一遍,如下:

格式: #ssh 用户名@服务器IP

示例: #ssh mimvp@123.57.78.100

mimvp@123.57.78.100's password: (这里需要手动输入密码后回车

 

想偷懒,不手动输入密码,怎么办?

方法一、密钥验证

密钥验证安全许多,配置也简单,支持ssh、scp、sftp等登录都免去了输入密码的麻烦,推荐使用。

1. 在本地电脑上,生成密匙

# cd ~/.ssh/
# ssh-keygen -t rsa

// 一路回车在当前用户的根目录下的.ssh目录生成id_rsa.pub公钥

本地电脑上,生成了公钥和私钥

-rw-------  1 homer homer 1679 Nov 16 11:48 id_rsa
-rw-r--r--  1 homer homer  394 Nov 16 11:48 id_rsa.pub

2. 将本地电脑上的公钥,拷贝到远程服务器上,让远程服务器知道本地电脑(类似于在远程服务器上设置了本地电脑的白名单ip)

# scp ~/.ssh/id_rsa.pub mimvp@123.57.78.100:~/.ssh/authorized_keys

// 将本地生成的公钥拷贝到远程服务器的下并改名为authorized_keys

说明:本地电脑上的id_rsa.pub (公钥)文件会存放在远程服务器上的 authorized_keys 文件中。

ssh默认目录为~/.ssh/,配置文件在 /etc/ssh/ssh_config

这样就大功告成了!

 

ssh 免密登录命令

# ssh mimvp@123.57.78.100                  // 不用再手动输入密码

# ssh mimvp@123.57.78.100  /bin/ls -l /tmp/data                 // 不用再手动输入密码,登录后执行命令,查看远程服务器上的目录文件

通过ssh登录、通过scp或者sftp传输文件,不用再输入密码了!

 

 

方法二、sshpass 免密登录

ssh 登陆不能在命令行中指定密码,因为 sshpass 出现了,解决了这一问题。

sshpass用于非交互SSH的密码验证,一般用在shell脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能生效)。

sshpass 允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。

 

sshpass 安装

sudo apt-get install sshpass     // Ubuntu

# yum -y install sshpass           // Linux (CentOS)

 

MacOS 手动下载安装:

1)方式1:https://sourceforge.net/projects/sshpass/files/   或 github

2)方式2:百度网盘下载:sshpass-1.06.tar.gz (提取码:  r7vm

MacOS 手动安装命令:

tar -zxvf sshpass-1.06.tar.gz
cd sshpass-1.06
./configure
make && make install

或者

# tar xf sshpass-1.06.tar.gz 
# cd sshpass-1.06
# ./configure --prefix=/usr/local/
# make && make install
# cp /usr/local/bin/sshpass /usr/bin/

安装完成后使用sshpass允许你用 -p 参数指定明文密码,然后直接登录远程服务器。

 

sshpass 命令使用

格式: sshpass -p '密码' ssh 用户名@服务器IP -p 端口号 -q -o StrictHostKeyChecking=no

示例: sshpass -p '123456' ssh mimvp@123.57.78.100 -p 22 -q -o StrictHostKeyChecking=no

注:若不指定用户,默认为本机使用的用户;若不指定端口,默认为22端口

sshpass -p 指定密码,后面跟上标准的 ssh 连接命令,ssh -p 指定端口号,默认为22

 

StrictHostKeyChecking 也可以通过修改ssh配置文件:

1)修改 /etc/ssh/ssh_config文件

vim /etc/ssh/ssh_config

#    StrictHostKeyChecking ask

改为

    StrictHostKeyChecking no

2)修改 /etc/ssh/ssh_config文件

#    GSSAPIAuthentication no

打开注释,修改为

    GSSAPIAuthentication no     

3)重启 sshd

service sshd restart  或  systemctl restart sshd.service

 

sshpass 帮助:

$ sshpass --help
sshpass: illegal option -- -
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
   -f filename   Take password to use from file
   -d number     Use number as file descriptor for getting password
   -p password   Provide password as argument (security unwise)
   -e            Password is passed as env-var "SSHPASS"
   With no parameters - password will be taken from stdin

   -P prompt     Which string should sshpass search for to detect a password prompt
   -v            Be verbose about what you're doing
   -h            Show help (this screen)
   -V            Print version information
At most one of -f, -d, -p or -e should be used

 

sshpass 示例

1)直接输入密码登录

sshpass -p 'password' ssh user@192.168.0.1 -p 22

2)以密码文件登录,

passwd.txt 保存密码,例如

vim passwd.txt 先写入密码 'password'

sshpass -f passwd.txt ssh user@192.168.0.1 -p 22

 

3)从环境变量中获取密码登录

先提前设置环境变量

export SSHPASS='password'    # 可在 /etc/profile 文件里配置,source /etc/profile 使其生效

sshpass -e ssh user@192.168.0.1-p 22

 

4)执行命令(-f和-e使用同上)

sshpass -p 'password' ssh user@192.168.0.1 -p 22 "ls /home"

 

5)文件复制(-f 文件密码,-e 变量密码,使用方式同上)

复制远程服务器文件到本地

sshpass -p 'password' scp -r user@192.168.0.1:/home/mimvp-blog.txt /home/

复制本地文件到远程服务器

sshpass -p 'password' scp -r /home/mimvp-blog.txt  user@192.168.0.1:/home/

说明:scp是全量拷贝并覆盖,若增量拷贝请使用rsync

 

6)忽略交互连接远程主机执行命令

sshpass -p 'password' ssh -q -o StrictHostKeyChecking=no user@192.168.0.1 -p 23456 '/bin/ls /tmp'

说明:​在远程主机上执行命令后就退出远程主机。当需要在很多主机上执行一条相同命令时需要这个参数

 

 

参考推荐

Linux两台主机之间建立信任

Linux 修改SSH 默认端口 22,防止被破解密码

Linux 修改默认端口、增加普通用户、使用密钥等安全登录SSH

Linux ssh 切换登录用户自动转到root用户

Linux shell 脚本通过expect实现自动输入密码

Linux expect 命令无需输入密码登陆

Linux sudo 免密码输入

SecureCRT 自动登录设置

Linux ssh 命令原理详解

JumpServer 堡垒机环境搭建详解

Windows 连接 Linux 常用工具

Linux之/etc/profile、~/.bash_profile等几个文件的执行过程

自建服务器解决外网访问内网的端口穿透映射

LastPass 跨平台密码管理工具