一行命令上服务器,避免烦人的登录验证过程

207 阅读4分钟

连接到单个服务器

#!/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 路径中的一个目录下,这样就可以从任何位置执行该脚本了。以下是具体步骤:

  1. 选择一个目录: 选择一个你希望存放全局可用脚本的目录。通常情况下,系统已经配置了一些目录,比如 /usr/local/bin,用于存放用户自定义的可执行文件。

  2. 将脚本复制到目录中: 将你的 shell 脚本复制到所选目录中。假设你的脚本叫做 ssh-login.ecs,你可以使用以下命令复制脚本到 /usr/local/bin 目录:

    sudo cp ssh-login.ecs /usr/local/bin
    

    这个命令需要管理员权限,因此可能会提示你输入管理员密码。

  3. 添加执行权限: 确保你的脚本具有执行权限。如果没有,你可以使用以下命令添加执行权限:

    sudo chmod +x /usr/local/bin/ssh-login.ecs
    
  4. 验证是否可用: 现在,你可以在任何位置使用脚本了。打开终端,并执行以下命令来验证:

    ssh-login.ecs
    

    如果一切顺利,你的脚本应该会执行。

通过这些步骤,你的脚本就可以在 macOS 上全局可用了。

扩展时改哪?

  • 只修改修改服务器信息 就行了,
  • 下边的shell代码不用改,
  • 扩展时,按照格式复制,替换为新的机器就行了.

服务器系统重置后,出现如下情况

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 
翻译过来就是 
警告:远程主机标识已更改!

本地ssh链接前,执行下

ssh-keygen -R XX.XX.XX.XX