连接到单个服务器
#!/bin/bash
# 服务器地址
SERVER="your_server_ip"
# 服务器用户名
USERNAME="your_username"
# 服务器密码
PASSWORD="your_password"
# SSH端口号
PORT="22"
# 检查参数是否提供,如果提供了则使用提供的值,否则使用默认值
if [ $# -ge 1 ]; then
PORT="$1"
fi
# 使用expect命令自动化登录过程
expect -c "
spawn ssh -p $PORT $USERNAME@$SERVER
expect {
\"*assword:\" {send \"$PASSWORD\r\"; interact}
\"Connection refused\" {puts \"错误:连接被拒绝\"; exit 1}
\"Network error\" {puts \"错误:网络异常\"; exit 1}
\"timeout\" {puts \"错误:连接超时\"; exit 1}
\"yes/no\" {send \"yes\r\"; exp_continue}
}
"
将脚本保存为 ssh-login,然后使用 chmod +x ssh-login 命令给脚本添加执行权限。最后,在终端中运行 ./ssh-login 即可登录到指定的服务器上。
连接到多个服务器
你可以将服务器信息存储在一个数组中,然后使用循环来连接每个服务器。以下是修改后的脚本:
下面是一个我本地机器上运行的脚本,ip信息模糊处理了,允许选择多个服务器节点并实现免密登录:
#!/bin/bash
# 定义服务器信息
servers=(
#"IP地址1 端口号 用户名 密码 机器的别名"
"60.xx.xx.xx 22 user password hello-kb"
"47.xx.xx.xx 22 用户名 密码 机器的别名"
"81.xx.xx.xx 22 用户名 密码 机器的别名"
"140.xx.xx.xx 22 用户名 密码 机器的别名"
#添加更多服务器信息,按照上面格式写为一行即可
)
# 下面是基本的脚本逻辑,没有需求,不用修改
# 输出服务器列表
echo "请选择要连接的服务器:"
for idx in "${!servers[@]}"; do
server_info="${servers[$idx]}"
IFS=' ' read -ra server_info_arr <<< "$server_info"
ip="${server_info_arr[0]}"
alias="${server_info_arr[4]}"
# 检查是否设置别名
if [ -z "$alias" ]; then
echo "$idx: $ip"
else
echo "$idx: $alias ($ip)"
fi
done
# 获取服务器数量
num_servers=${#servers[@]}
# 提示输入索引号范围
echo "请输入索引号范围 (0-$((num_servers - 1))):"
# 获取用户输入的索引号
read -p "输入服务器索引号以连接: " selected_index
# 检查是否输入了索引号
if [ -z "$selected_index" ]; then
echo "错误:未输入服务器索引号。"
exit 1
fi
# 检查索引号是否在有效范围内
if [ $selected_index -ge 0 ] && [ $selected_index -lt $num_servers ]; then
# 获取所选服务器的信息
selected_server_info="${servers[$selected_index]}"
IFS=' ' read -ra server_info <<< "$selected_server_info"
ip="${server_info[0]}"
port="${server_info[1]}"
username="${server_info[2]}"
password="${server_info[3]}"
# 使用expect命令自动化登录过程
expect -c "
spawn ssh -p $port $username@$ip
expect {
\"*assword:\" {send \"$password\r\"; interact}
\"Connection refused\" {puts \"错误:连接被拒绝\"; exit 1}
\"Network error\" {puts \"错误:网络异常\"; exit 1}
\"timeout\" {puts \"错误:连接超时\"; exit 1}
\"yes/no\" {send \"yes\r\"; exp_continue}
}
"
else
echo "错误:未找到该索引号对应的IP。"
fi
将脚本保存为 ssh-login.ecs,然后使用 chmod +x ssh-login.ecs 命令给脚本添加执行权限。最后,在终端中运行 ./ssh-login.ecs 即可登录到指定的服务器上。
执行过程:
[我的本地电脑终端]# ./ssh-login.ecs
请选择要连接的服务器:
0: 机器的别名 (60.xx.xx.xx)
1: 机器的别名 (47.xx.xx.xx)
2: 机器的别名 (81.xx.xx.xx)
3: 机器的别名 (140.xx.xx.xx)
请输入索引号范围 (0-3):
输入服务器索引号以连接: 0
# 等100ms
Welcome to Alibaba Cloud Elastic Compute Service !
[root@iZ2ze4l78pntnohi035fk1Z ~]# ls -al
修改为全局可用
要将一个 shell 脚本设置为全局可用,在 macOS 上,你可以将脚本放置在系统的 PATH 路径中的一个目录下,这样就可以从任何位置执行该脚本了。以下是具体步骤:
-
选择一个目录: 选择一个你希望存放全局可用脚本的目录。通常情况下,系统已经配置了一些目录,比如
/usr/local/bin,用于存放用户自定义的可执行文件。 -
将脚本复制到目录中: 将你的 shell 脚本复制到所选目录中。假设你的脚本叫做
ssh-login.ecs,你可以使用以下命令复制脚本到/usr/local/bin目录:sudo cp ssh-login.ecs /usr/local/bin这个命令需要管理员权限,因此可能会提示你输入管理员密码。
-
添加执行权限: 确保你的脚本具有执行权限。如果没有,你可以使用以下命令添加执行权限:
sudo chmod +x /usr/local/bin/ssh-login.ecs -
验证是否可用: 现在,你可以在任何位置使用脚本了。打开终端,并执行以下命令来验证:
ssh-login.ecs如果一切顺利,你的脚本应该会执行。
通过这些步骤,你的脚本就可以在 macOS 上全局可用了。
扩展时改哪?
只修改修改服务器信息就行了,- 下边的shell代码不用改,
- 扩展时,按照格式复制,替换为新的机器就行了.
服务器系统重置后,出现如下情况
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
翻译过来就是
警告:远程主机标识已更改!
本地ssh链接前,执行下
ssh-keygen -R XX.XX.XX.XX