Linux 實現自動登陸遠程機器
在 Linux 下進行遠程登陸的時候,總是要進行 ssh 輸入賬號密碼,相對比較繁瑣。而在工作中總會先從本地登陸到公司的中間機器(跳板機)然後才能登陸到線上的機器,每次操作更加繁瑣。如果從 A -> B 可以直接進行建立相互的信任關係來解決面輸入密碼的問題。顯示情況如果 A -> B -> C 三台機器,如果想從 A 直接到 C 只能通過 B 進行登錄,這樣就無法建立 A -> C 的信任關係(這種操作主要是為了保護線上機器不能隨便登錄)。該腳本就是解決這種有多個依賴的關係。
注意事項:
1. 使用實時 bash version >= 4.0,因為配置中需要使用關聯數據
2. 如果需要全局使用直接修改 autologin 的名字,移動到 PATH 路徑下即可 eg: mv autologin /usrl/local/bin/to(改為自己想要使用的名字)
腳本代碼:
#!/usr/local/bin/bash
# @Version 0.3.1
# @filename to
# 修復等不需要要配置跳板機的時候執行命令,在配置跳板機位置默認填 no 即可
# @Author pemakoa@gmail.com
# Bash version >= 4.0 使用關聯數組
# Usage: host user passwd port jump_host command
# 四種情況如下:
# 1. 直接登錄目標機器 如 A
# 2. 需要中間機器登陸到目標機器 如 C, 其中 B 為中間機器,會先登錄 B在從 B登陸到 C然後執行 command
# 3. 直接登錄目標機器並執行相應的命令 如 D
declare -A _server_config
_server_config["A"]="a_host a_user a_passwd a_port"
_server_config["B"]="b_host b_user b_passwd b_port"
_server_config["C"]="c_host c_user c_passwd c_port B "(command eg) ls .""
_server_config["D"]="d_host d_user d_passwd d_port no "cd /home && ll""
_config_keys=(${!_server_config[@]})
_length=${#_server_config[@]}
_login_server=$1
_config_status=false
# 是否輸入登陸機器
if [ "$_login_server" == "" ];then
echo -e " 33[40m 33[31m Please input login server, you can choose one follows list 33[0m"
for i in "${_config_keys[@]}";do
echo -e " 33[41;37m $i 33[0m "
done
exit
fi
# 檢查登陸的機器是否配置
for i in "${_config_keys[@]}";do
if [ "$_login_server" == "$i" ];then
_config_status=true
fi
done
if [ "${_config_status}" == "false" ];then
echo -ne " 33[40m 33[31m
Not config server info ...
Please config in _server_config like
Host User Passwd Port Jump Command 33[0m"
exit
fi
# 登陸 如果配置跳板機,先登陸跳板機在登陸到目標機器
_host=$(echo ${_server_config["${_login_server}"]} | awk "{print $1}")
_user=$(echo ${_server_config["${_login_server}"]} | awk "{print $2}")
_passwd=$(echo ${_server_config["${_login_server}"]} | awk "{print $3}")
_port=$(echo ${_server_config["${_login_server}"]} | awk "{print $4}")
_jump=$(echo ${_server_config["${_login_server}"]} | awk "{print $5}")
_command=$(echo ${_server_config["${_login_server}"]} | awk -F""" "{print $2}")
if [ "${_command}" != "" ]; then
_command="expect "*]*"
send "${_command}
""
fi
if [ "${_jump}" != "" ] && [ "${_jump}" != "no" ]; then
_jump_host=$(echo ${_server_config["${_jump}"]} | awk "{print $1}")
_jump_user=$(echo ${_server_config["${_jump}"]} | awk "{print $2}")
_jump_passwd=$(echo ${_server_config["${_jump}"]} | awk "{print $3}")
_jump_port=$(echo ${_server_config["${_jump}"]} | awk "{print $4}")
expect -c "
set timeout 30
spawn ssh -p${_jump_port} ${_jump_user}@${_jump_host}
expect {
"yes/no" { send "yes
"; exp_continue }
"assword" { send "${_jump_passwd}
" }
}
expect "*]*"
send "ssh -p${_port} ${_user}@${_host}
"
expect "assword:"
send "${_passwd}
"
${_command}
interact"
else
expect -c "
set timeout 30
spawn ssh -p${_port} ${_user}@${_host}
expect {
"yes/no" {send "yes
"; exp_continue }
"*assword:" { send "$_passwd
" }
}
${_command}
interact
"
fi
※Linux 常用基本命令 cal date
※Shell 中的特殊字元
TAG:程序員小新人學習 |