一元暴、Linux無密碼登陸
a.通過設置KEY登陸(推薦)
生成密鑰:ssh-keygen
安裝密鑰到遠程主機:ssh-copy-id 用戶名@主機地址
注意:ssh-copy-id
將key寫到遠程機器的~/.ssh/authorized_key
文件中淋硝。b.使用sshpass命令(需安裝):
sshpass -p "ssh密碼" ssh 用戶名@主機地址
c.使用plink工具連接(windows):
plink.exe -pw "ssh密碼" ssh 用戶名@主機地址
二、Linux命令應答命令expect(需安裝)
1.expect簡介
expect 是用來進行自動化控制和測試的工具廓脆。主要是和交互式軟件 telnet ftp passwd fsck rlogin ssh tip 等進行自動化的交互。-
2.expect關鍵命令
send //向進程發(fā)送字符串模擬用戶的輸入,注意一定要加 \r 回車 expect //從進程接收字符串 spawn //啟動進程(由spawn啟動的進程的輸出可以被expect所捕獲) interact //用戶交互
-
3.expect使用
單一分支語法:expect "hello" {send "you said hello"}
當輸出中包含hello后郭脂,輸出you said hello
多分支模式語法:expect { "lilei" {send "hello lilei"; exp_continue} "hanmeimei" {send "hello hanmeimei"; exp_continue} "how do you do ?" {send "how do you do"} }
命令說明:
當輸出中包含lilei時 輸出hello lilei,同時循環(huán)此多分支語句糠馆。
當輸出中包含hanmeimei時 輸出hello hanmeimei,同時循環(huán)此多分支語句除嘹。
當輸出中包含how do you do ?時 輸出dow do you do写半。 -
4.使用實例
-
遠程登錄服務器并創(chuàng)建文件夾
#!/usr/bin/expect set timeout -1 spawn ssh root@192.168.0.107 expect { "password" {send "123456\r";} "yes/no" {send "yes\r";exp_continue} } expect "root" {send "mkdir test\r"} expect eof exit
-
expect腳本獲取參數(shù):
#!/usr/bin/expect set ip [lindex $argv 0] set password [lindex $argv 1] set timeout -1 spawn ssh root@$ip expect { "password" {send "$password\r";} "yes/no" {send "yes\r";exp_continue} } expect "root" {send "mkdir test1\r"} expect "root" {send "mkdir test2\r"} send "exit\r" //退出遠程登錄 expect eof exit
./expect.ex 192.168.0.107 123456
-
遠程登錄服務器等待手動操作:
#!/usr/bin/expect set ip [lindex $argv 0] set password [lindex $argv 1] set timeout -1 spawn ssh root@$ip expect { "password" {send "$password\r";} "yes/no" {send "yes\r";exp_continue} } interact
./expect.ex 192.168.0.107 123456
-
使用scp傳輸文件:
#!/usr/bin/expect set timeout -1 spawn scp test.txt root@192.168.0.107:/home/ expect { "password" {send "123456\r";} "yes/no" {send "yes\r";exp_continue} } expect eof exit
-
在本地開啟socks5的代理:
#!/usr/bin/expect set timeout -1 //expect匹配輸出的超時時間 spawn ssh -N -D 0.0.0.0:1080 localhost //新建一個進程,執(zhí)行ssh命令 expect { "yes/no" {send "yes\r";exp_continue} // "password" {send "123\r"} } expect eof exit
命令說明:
根據(jù)進程輸出執(zhí)行預先設置好的命令:
假如輸出包含yes/no尉咕,則表示是第一次登入需要輸入yes來添加信任叠蝇。exp_continue
表示繼續(xù)此循環(huán)。
假如輸出包含password年缎,表示需要輸入密碼悔捶。
expect eof
是在等待結束標志。由spawn
啟動的命令在結束時會產(chǎn)生一個eof標記单芜,expect eof
即在等待這個標記蜕该,因為ssh -N -D 0.0.0.107:1080 localhost 程序需要一直運行
,所以將timeout
設置為-1即可無限制的等待洲鸠。 -
指定登陸機器
從computerInfo里讀取相應機器信息堂淡,用戶選擇登陸其中一臺機器馋缅。
computerInfo.txt內(nèi)容:#ip port user password description 192.168.1.1 root 123456 'first machine' 192.168.1.2 root 123456 'second machine'
core.ex腳本內(nèi)容:
#!/usr/bin/expect set ip [lindex $argv 0] set port [lindex $argv 1] set username [lindex $argv 2] set password [lindex $argv 3] set timeout -1 spawn ssh -p $port $username@$ip expect { "password" {send "$password\r";} "yes/no" {send "yes\r";exp_continue} } interact
login.sh腳本內(nèi)容:
#!/bin/bash file="computerInfo.txt" #顯示機器信息 過濾第一行和空行 awk '{if (NR > 1 && $1 != ""){printf "%-2s %-45s %-15s \n",NR")",$5,$1}}' $file echo "please choose which machine to login:" read number #將信息存入變量 read ip port user password <<< $(echo `awk 'NR=="'$number'"{print $1,$2,$3,$4}' $file`) ./core.ex $ip $port $user $password
-
參考文章:
Linux Expect 簡介和使用實例