SSH自动登录方法总结
一. 生成私钥公钥方式登录
生成私钥公钥对
- 在命令行输入
ssh-keygen
。首先在本生机器成私钥公钥对,生成过程中一路回车使用默认值。完成后会在家目录~/.ssh/
下生成两个文件:id_rsa
和id_rsa.pub
,id_rsa
是私钥,id_rsa.pub
是公钥。
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rwzs4iF/opTOijmoYMabsVNkYEOHmMk3X9UOkz/TwK0 root@ycs.com
The key's randomart image is:
+---[RSA 2048]----+
|++.. ..+ . |
|+*.o . + + . |
|. + o . = + |
| o . E . |
| o S o |
|. o . . |
|o== . o . |
|B*=ooo.o . |
|**=oo+. o |
+----[SHA256]-----+
上传私钥公钥对
将 id_rsa.pub
上传到要登录的服务器上。
- 方法1:可以直接将
id_rsa.pub
的内容直接复制粘贴到远程的~/.ssh/authorized_keys
文件亦可,一行表示一个用户的公钥,注意 authorized_keys 文件的权限必须是 600。 - 方法2:使用
ssh-copy-id
命令上传,需要输入远程服务器用户的密码。
ssh-copy-id username@1.1.1.1
二. 使用 sshpass 自动登录
sshpass
可以自动输入密码
# centos安装
sudo yum install -y sshpass
# ubuntu安装
sudo apt install sshpass
# 使用 sshpass -p password
# -o StrictHostKeyChecking=no 表示首次登录时避免提示信息
sshpass -p mypassword ssh -p 22 -o StrictHostKeyChecking=no username@1.1.1.1
三. 使用 expect 自动登录
3.1 自动登录后不退出
- 有些系统没有安装此命令
# ubuntu 安装
sudo apt install expect
# centos 安装
sudo yum install expect
expect_auto_ssh.expect
注意是 expect 脚本,不是 shell 脚本。
#!/usr/bin/expect
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set pswd [lindex $argv 3]
# spawn 是 expect 环境的内部命令。
# 主要的功能是管理 ssh 运行的进程,用来传递交互指令。
spawn ssh -p $port $user@$host
# 进入交互式
# 遇到yes/no输入yes回车, 继续
# 出现密码提示,发送密码
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pswd\r" }
}
# 交互模式,用户会停留在远程服务器上面
interact
- 使用此脚本
# 执行权限
chmod +x ./expect_auto_ssh.expect
# 有执行权限运行
./expect_auto_ssh.expect host port user pswd
# 或者指定 expect 命令运行
expect ./expect_auto_ssh.expect host port user pswd
3.2 登录执行命令后退出
- 下面的示例展示了登录远程会话,然后执行命令后退出会话。
#!/usr/bin/expect
set timeout 30
set host [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set pswd [lindex $argv 3]
# spawn 是 expect 环境的内部命令。
# 主要的功能是管理 ssh 运行的进程,用来传递交互指令。
spawn ssh -p $port $user@$host
# 进入交互式
# 遇到yes/no输入yes回车, 继续
# 出现密码提示,发送密码
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$pswd\r" }
}
# 登录后执行命令退出: 注意特殊字符的转义
expect "*$ "
send "pwd\r"
send "echo \"now is \$(date). \" >/tmp/expect_test \r"
send "exit\r"
expect eof