SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。
什么是SSH公钥检查
SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:
The authenticity of host '10.0.0.1 (10.0.0.1)' can't be established.
ECDSA key fingerprint is 91:63:21:08:4a:96:23:5b:f6:98:c9:a8:cd:cb:8b:91.
Are you sure you want to continue connecting (yes/no)?
当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。
如何去掉公钥确认?
在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务由于初次连接服务器而任务中断。或者由于~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:
Host *
StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 参数
$ ssh -o StrictHostKeyChecking=no 10.0.0.1
---------------------
1: 当通过ssh连接远程服务器的时候,可能会出现以下繁琐场景,需要手工输入yes:
ssh username@ip
这对于某些分布式集群来说是不行的,甚至导致集群都不能启动成功,对于像pssh,pscp这样的自动化工具来说,也不希望这一步的验证,如何在连接的时候不提示这个信息呢:
1 |
方法1、 ssh -o "StrictHostKeyChecking no" username@ hostname <br>方法2:修改 /etc/ssh/ssh_config ,在文件最后添加 StrictHostKeyChecking no,接着重启 ssh 服务
|
2:远程执行服务器上面的命令可以通过sshpass(当集群机器之间没有免密的时候),如果没有安装,,执行 yum install sshpass -y
用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@ test ~] # sshpass -h
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" -----通过设置环境变量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
|
Eg:
(1)使用 -f
1 2 3 4 |
[root@ test ~] # sshpass -f passwd.txt ssh [email protected] "free -m"
total used free shared buff /cache available
Mem: 96405 27169 12563 4066 56672 63775
Swap: 126 19 107
|
(2)使用 -p
1 2 3 4 |
[root@ test ~] # sshpass -p "mypasswd" ssh [email protected] "free -m"
total used free shared buff /cache available
Mem: 96405 27168 12584 4066 56652 63777
Swap: 126 19 107
|
注:生产环境不要使用这种方式,不安全
(3)使用 -e
1 2 3 4 5 6 7 |
[root@ test ~] # export SSHPASS="mypasswd"
[root@ test ~] # echo $SSHPASS
mypasswd
[root@ test ~] # sshpass -e ssh [email protected] "free -m"
total used free shared buff /cache available
Mem: 96405 27209 12561 4066 56634 63735
Swap: 126 19 107
|
当然,这种方式只针对当前shell有用,如果要配置永久生效,请修改/etc/profile文件
(4)sshpass、ssh都支持多命令调用,只要在命令之间使用&&号就行。
1 2 3 4 5 6 7 8 |
[root@ test ~] # sshpass -e ssh -l root -o 'StrictHostKeyChecking no' 192.168.4.50 ls /home && free -m
hadoop
mysql
yjt
zbc
total used free shared buff /cache available
Mem: 977 364 95 49 518 366
Swap: 4095 35 4060
|
3、如果想要远程机器调用本地脚本,那么可以如下实现
(1)ssh方式
1 2 |
[root@ test ~] # ssh -l root -o 'StrictHostKeyChecking no' 192.168.4.50 bash -s < test46.sh
runstone.com
|
(2)sshpass方式
1 2 |
[root@ test ~] # sshpass -e ssh -l root -o 'StrictHostKeyChecking no' 192.168.4.50 bash -s < test46.sh
runstone.com
|
4、支持sudo
有些命令需要权限才行,当不想重复输入密码的时候,可以通过这种方式。
(1)格式:cmd ---> 'echo password | sudo -S cmd'
eg:
1 |
[root@ test ~] # sshpass -p 123456 ssh -o 'StrictHostKeyChecking no' [email protected] 'echo 123456 | sudo -S mkdir /backup'
|
注:-S的意思是从标准输入读取密码
对于echo,dd等命令,可能会出现权限不够问题,如:
1 2 |
[root@ test ~] # sshpass -p 123456 ssh -o 'StrictHostKeyChecking no' [email protected] 'echo 123456 | sudo -S echo hello > /backup/file'
bash : /backup/file : Permission denied
|
对于上述方式,解决办法如下:
(2)格式:cmd ---> 'echo password | sudo -S sh/bash -c "cmd"'
eg:
1 |
root@ test ~] # sshpass -p 123456 ssh -o 'StrictHostKeyChecking no' [email protected] 'echo 123456 | sudo -S bash -c "echo hello > /backup/file"'
|