在使用sshpass
登录远程服务器后,你可以通过两种方式执行命令:直接在命令行中指定远程命令或通过管道传递命令。以下是详细用法和示例:
一、基本语法:直接执行远程命令
将需要执行的命令放在ssh
之后,用引号包裹:
sshpass -p "密码" ssh user@host "远程命令1; 远程命令2; ..."
示例1:查看远程服务器磁盘空间
sshpass -p "123456" ssh root@192.168.139.150 "df -h; free -m"
示例2:创建目录并复制文件
sshpass -p "123456" ssh root@192.168.139.150 "mkdir -p /data; cp /etc/hosts /data/"
二、通过管道执行多条命令
使用<< EOF
创建 heredoc,将多行命令传递给远程服务器:
sshpass -p "密码" ssh user@host << EOF
远程命令1
远程命令2
...
EOF
示例:批量配置远程服务器
StrictHostKeyChecking=no 用于控制 SSH 客户端如何验证远程服务器的主机密钥(第一次SSH登录需要用到)
sshpass -p "123456" ssh -o StrictHostKeyChecking=no root@192.168.139.150 << EOF
# 更新系统
yum update -y
# 安装nginx
yum install -y nginx
# 启动服务
systemctl start nginx
systemctl enable nginx
EOF
三、在脚本中组合使用
如果你需要在脚本中循环执行多个命令,可以这样写:
#!/bin/bash
# 定义服务器列表和密码
HOSTS=("192.168.139.150" "192.168.139.151")
USER="root"
PASSWD="123456"
# 遍历服务器执行命令
for host in "${HOSTS[@]}"; do
echo "正在服务器 $host 上执行命令..."
# 方法1:直接执行单个命令
sshpass -p "$PASSWD" ssh "$USER@$host" "mkdir -p /data/backup"
# 方法2:通过管道执行多条命令
sshpass -p "$PASSWD" ssh "$USER@$host" << EOF
cd /data
touch test.txt
echo "Hello from $(hostname)" > test.txt
ls -l
EOF
done
四、注意事项
引号与变量扩展:
- 双引号
"
会解析本地变量,单引号'
会保留命令原貌。
# 错误示例:本地变量不会在远程执行 LOCAL_VAR="test" sshpass -p "123456" ssh root@host "echo $LOCAL_VAR" # 输出本地变量值 # 正确示例:使用单引号或转义$符号 sshpass -p "123456" ssh root@host 'echo $LOCAL_VAR' # 输出远程变量值
- 双引号
复杂命令需要转义:
# 错误示例:括号会被本地Shell解析 sshpass -p "123456" ssh root@host "if [ -f /etc/hosts ]; then echo '文件存在'; fi" # 正确示例:使用转义或单引号 sshpass -p "123456" ssh root@host 'if [ -f /etc/hosts ]; then echo "文件存在"; fi'
安全建议:
- 避免在脚本中明文存储密码,改用环境变量或密钥认证。
- 生产环境推荐使用
ssh-keygen
和ssh-copy-id
配置无密码登录。
五、扩展用法
上传文件到远程服务器:
sshpass -p "123456" scp local_file.txt root@192.168.139.150:/remote/path/
从远程服务器下载文件:
sshpass -p "123456" scp root@192.168.139.150:/remote/file.txt /local/path/
执行带sudo权限的命令:
sshpass -p "123456" ssh root@host "sudo yum install -y nginx"
通过上述方法,你可以灵活地使用sshpass
登录远程服务器并执行各种命令,适用于自动化部署、批量管理等场景。
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。