日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shell脚本实现无密码交互的SSH自动登陆

發(fā)布時(shí)間:2024/4/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell脚本实现无密码交互的SSH自动登陆 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shell腳本實(shí)現(xiàn)無(wú)密碼交互的SSH自動(dòng)登陸 ?

ssh連接遠(yuǎn)程主機(jī)時(shí)候詢(xún)問(wèn)密碼,跟su、sudo命令的默認(rèn)行為一樣,是不從stdin讀入數(shù)據(jù)的,據(jù)稱(chēng)是為安全考慮,但是有時(shí)候在腳本當(dāng)中確實(shí)需要無(wú)人守值的登陸。

搜索一下不難找到類(lèi)似的例子,使用expect來(lái)完成密碼應(yīng)答:

#!/bin/bash
auto_login_ssh () {
??? expect -c "set timeout -1;
??????????????? spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3};
??????????????? expect *assword:*;
??????????????? send -- $1\r;
??????????????? interact;";
}
?
auto_login_ssh passwd user@host


StrictHostKeyChecking=no參數(shù)讓ssh默認(rèn)添加新主機(jī)的公鑰指紋,也就不會(huì)出現(xiàn)出現(xiàn)是否繼續(xù)yes/no的提示了。

expect很不錯(cuò),上述代碼基本可以達(dá)到要求了,能夠當(dāng)FQ用的ssh -D自動(dòng)登陸,執(zhí)行遠(yuǎn)程命令等等,但是如果作為一個(gè)完全非交互的遠(yuǎn)程工具,應(yīng)該說(shuō)還一差,不能返回整個(gè)連接執(zhí)行過(guò)程是否成功。

使用expect后,程序的exit status是expect的,而不是ssh的,所以如果遇上連接不到的主機(jī)、密碼錯(cuò)誤等情況,expect也一樣是正常退出,$?為0,所以需要對(duì)expect的代碼稍加修改;

#!/bin/bash
auto_smart_ssh () {
??? expect -c "set timeout -1;
??????????????? spawn ssh -o StrictHostKeyChecking=no $2 ${@:3};
??????????????? expect {
??????????????????? *assword:* {send -- $1\r;
???????????????????????????????? expect {
??????????????????????????????????? *denied* {exit 2;}
??????????????????????????????????? eof
???????????????????????????????? }
??????????????????? }
??????????????????? eof???????? {exit 1;}
??????????????? }
??????????????? "
??? return $?
}
?
auto_smart_ssh passwd user@host ls /var
echo -e "\n---Exit Status: $?"


這段expect的Tcl代碼主要作用是,如果在輸入密碼后遇到Permission denied,肯定是腳本提供的帳號(hào)有問(wèn)題,就直接讓expect按狀態(tài)2退出;而如果主機(jī)不可達(dá)No route to host, timed out, Connection refused等情況,ssh會(huì)直接退出,expect收到eof,讓其按狀態(tài)1退出。而因?yàn)檫@個(gè)設(shè)計(jì)本來(lái)就用于執(zhí)行遠(yuǎn)程命令后退出,不需要用戶(hù)交互,所以第9行的eof則是讓expect等待ssh退出,而不是不是進(jìn)行interact了。

有這樣的處理,使用autosmartssh的腳本就可以根據(jù)返回值判斷執(zhí)行過(guò)程的是否成功,而進(jìn)行相應(yīng)處理了。

openssh里面另外一個(gè)很好用的遠(yuǎn)程文件傳輸工具scp,也以如法炮制:

auto_scp () {
??? expect -c "set timeout -1;
??????????????? spawn scp -o StrictHostKeyChecking=no ${@:2};
??????????????? expect {
??????????????????? *assword:* {send -- $1\r;
???????????????????????????????? expect {
??????????????????????????????????? *denied* {exit 1;}
??????????????????????????????????? eof
???????????????????????????????? }
??????????????????? }
??????????????????? eof???????? {exit 1;}
??????????????? }
??????????????? "
??? return $?
}
?
auto_scp pass ~/myfile user@host:~/path/to/myfile
echo $?

后話(huà):
如果僅僅是日常使用,為了避免經(jīng)常輸入主機(jī)密碼的麻煩,最理想的方法是生產(chǎn)本機(jī)的公/私密鑰對(duì),把指紋直接復(fù)制到遠(yuǎn)程主機(jī)上,較新的openssh提供了ssh-copy-id工具:
ssh-keygen
ssh-copy-id user@host1
ssh-copy-id user@host2
ssh-copy-id user@host3

運(yùn)行ssh-keygen時(shí)會(huì)問(wèn)幾個(gè)問(wèn)題,全部回車(chē)默認(rèn)就是我們要的效果了,分別把密鑰分發(fā)到遠(yuǎn)程主機(jī)后,以后執(zhí)行ssh user@host,還是scp,都是直接完成了。

如果需要?jiǎng)h除遠(yuǎn)程機(jī)器上對(duì)應(yīng)本機(jī)本賬戶(hù)的密鑰,登陸到該賬戶(hù),打開(kāi)~/.ssh/authorized_keys文件,搜索你的用戶(hù)名,刪除那行,保存,即可。

當(dāng)然也可以自動(dòng)化:

auto_ssh_copy_id () {
??? expect -c "set timeout -1;
??????????????? spawn ssh-copy-id $2;
??????????????? expect {
??????????????????? *(yes/no)* {send -- yes\r;exp_continue;}
??????????????????? *assword:* {send -- $1\r;exp_continue;}
??????????????????? eof??????? {exit 0;}
??????????????? }";
}

轉(zhuǎn)載于:https://www.cnblogs.com/L-H-R-X-hehe/p/3793698.html

總結(jié)

以上是生活随笔為你收集整理的shell脚本实现无密码交互的SSH自动登陆的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。