Linux 跨服务器远程执行命令使用实践
概述
在日常运维和 DevOps 工作中,经常需要对多台服务器进行批量操作,如检查状态、更新配置、重启服务等。通过远程执行命令,可以高效地管理分布式环境,避免手动登录每台服务器的繁琐。
核心工具:SSH
SSH (Secure Shell) 是最常用且最安全的远程执行命令的协议。它提供加密通信,确保命令和数据传输的安全性。
基本语法
ssh user@hostname "command"
实战示例
1. 单台服务器执行命令
直接在命令行中执行:
ssh user@192.168.1.100 "df -h"
该命令会连接到 192.168.1.100 这台服务器,执行 df -h 命令并返回结果。
2. 多台服务器批量执行命令
使用 shell 循环或数组来批量执行:
# 方法一:for 循环
domains=(server1 server2 server3)
for domain in ${domains[@]}; do
echo "--- Executing on $domain ---"
ssh user@$domain "echo 'Hello from $domain'; uptime"
sleep 1
done
# 方法二:结合 find / xargs
find servers.txt -exec ssh user@{} "uptime" \;
3. 从文件读取服务器列表
创建一个包含所有服务器 IP/Hostnames 的文件 servers.txt:
# servers.txt 内容示例
centos-server-01.example.com
ubuntu-server-02.example.com
rocky-linux-03.example.com
然后用以下命令批量执行:
while IFS= read -r host; do
echo "Executing on $host"
ssh user@$host "sudo systemctl status nginx"
echo "--- Done with $host ---\n"
done < servers.txt
4. 批量执行复杂脚本
将复杂的操作写成一个脚本文件 check_health.sh,然后分发并执行:
# check_health.sh 内容
echo "Starting health check..."
uname -a
free -h
lsof -i :80
ps aux | grep nginx
分发并执行:
# 将脚本复制到所有服务器并执行
tar czf script.tar.gz check_health.sh
for host in $(cat servers.txt); do
scp script.tar.gz user@$host:/tmp/
ssh user@$host "cd /tmp && tar xzf script.tar.gz && bash check_health.sh"
echo "--- Done on $host ---\n"
rm -f script.tar.gz
done
高级工具:Ansible
对于更复杂的场景,推荐使用 Ansible 等自动化工具。它提供了更强大的编排能力,支持 Playbook 和 Inventory 管理。
Ansible 示例
# inventory.ini
[webservers]
web1 ansible_host=192.168.1.101
web2 ansible_host=192.168.1.102
[database]
db1 ansible_host=192.168.1.103
# playbook.yml
---
- name: Check system status on all servers
hosts: all
become: yes
tasks:
- name: Get system info
shell: uname -a
register: sys_info
- name: Display system info
debug:
msg: "System: {{ sys_info.stdout }}"
运行:
ansible-playbook -i inventory.ini playbook.yml
安全建议
使用密钥认证:避免密码暴露,设置 SSH 密钥认证。
限制访问权限:只允许必要的用户和组访问服务器。
定期轮换密钥:增强安全性。
监控日志:记录所有远程执行的操作,便于审计。
谨慎使用 root:避免直接用 root 用户执行命令,使用普通用户加 sudo。
常见问题排查
问题 1:拒绝连接 (Permission denied)
检查:
SSH 服务是否在目标服务器上运行。
防火墙是否放行了 22 端口。
用户名和密码是否正确(如果使用密码)。
SSH 密钥是否已正确添加到目标服务器的
~/.ssh/authorized_keys文件中。
问题 2:命令执行后立即退出
确保你的命令不会因为缺少终端而立即终止。如果命令是交互式的,考虑使用 nohup 或 & 后台运行。
问题 3:超时
增加超时时间:
ssh -o ConnectTimeout=60 user@hostname "command"
总结
掌握 Linux 跨服务器远程执行命令的能力,是现代运维的核心技能。从简单的 `ssh user@host "cmd"` 到复杂的脚本循环和 Ansible Playbook,可以根据实际需求选择合适的方法。安全、高效地管理多台服务器,让系统运维工作事半功倍。
评论区