SSH 公鑰檢查是一個重要的安全機制,能夠防範中間人劫持等黑客攻擊。可是在特定狀況下,嚴格的 SSH 公鑰檢查會破壞一些依賴 SSH 協議的自動化任務,就須要一種手段可以繞過 SSH 的公鑰檢查。mysql
什麼是SSH公鑰檢查
SSH 鏈接遠程主機時,會檢查主機的公鑰。若是是第一次該主機,會顯示該主機的公鑰摘要,提示用戶是否信任該主機:sql
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 中。當再次鏈接該主機時,就不會再提示該問題了。shell
如何去掉公鑰確認?
在首次鏈接服務器時,會彈出公鑰確認的提示。這會致使某些自動化任務因爲初次鏈接服務器而任務中斷。或者因爲~/.ssh/known_hosts 文件內容清空,致使自動化任務中斷。 SSH 客戶端的 StrictHostKeyChecking 配置指令,能夠實現當第一次鏈接服務器時,自動接受新的公鑰。只須要修改 /etc/ssh/ssh_config 文件,包含下列語句:安全
Host *
StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 參數bash
$ ssh -o StrictHostKeyChecking=no 10.0.0.1
--------------------- 服務器
1: 當經過ssh鏈接遠程服務器的時候,可能會出現如下繁瑣場景,須要手工輸入yes:ssh
ssh username@ip分佈式
這對於某些分佈式集羣來講是不行的,甚至致使集羣都不能啓動成功,對於像pssh,pscp這樣的自動化工具來講,也不但願這一步的驗證,如何在鏈接的時候不提示這個信息呢:ide
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 root@192.168.0.235 "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 root@192.168.0.235 "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 hduser@192.168.0.235 "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
|
三、若是想要遠程機器調用本地腳本,那麼能夠以下實現
(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
|
四、支持sudo
有些命令須要權限才行,當不想重複輸入密碼的時候,能夠經過這種方式。
(1)格式:cmd ---> 'echo password | sudo -S cmd'
eg:
1
|
[root@
test
~]
# sshpass -p 123456 ssh -o 'StrictHostKeyChecking no' yjt@192.168.4.50 'echo 123456 | sudo -S mkdir /backup'
|
注:-S的意思是從標準輸入讀取密碼
對於echo,dd等命令,可能會出現權限不夠問題,如:
1
2
|
[root@
test
~]
# sshpass -p 123456 ssh -o 'StrictHostKeyChecking no' yjt@192.168.4.50 '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' yjt@192.168.4.50 'echo 123456 | sudo -S bash -c "echo hello > /backup/file"'
|