使用SSH远程执行机器上的shell脚本

使用SSH执行远程机器上的Shell脚本有多种方法,下面详细介绍几种常用的方式:

方法1:直接执行远程脚本文件

bash 复制代码
# 执行远程服务器上已存在的脚本
ssh username@remote_host '/path/to/script.sh'

# 带参数执行
ssh username@remote_host '/path/to/script.sh arg1 arg2'

# 使用sudo权限执行
ssh username@remote_host 'sudo /path/to/script.sh'

方法2:本地脚本传输到远程执行

bash 复制代码
# 将本地脚本传输到远程并执行
ssh username@remote_host 'bash -s' < local_script.sh

# 带参数执行本地脚本
ssh username@remote_host 'bash -s arg1 arg2' < local_script.sh

# 使用cat和ssh组合
cat local_script.sh | ssh username@remote_host 'bash'

方法3:直接在命令行中编写脚本执行

bash 复制代码
# 执行单条命令
ssh username@remote_host 'ls -la /tmp'

# 执行多条命令(用分号分隔)
ssh username@remote_host 'cd /path/to/dir; ./script.sh; pwd'

# 执行复杂的多行命令
ssh username@remote_host << 'EOF'
cd /home/user
./deploy.sh
echo "部署完成"
EOF

方法4:使用Here Document执行多行脚本

bash 复制代码
ssh username@remote_host << 'ENDSSH'
#!/bin/bash
echo "当前用户: $(whoami)"
echo "当前目录: $(pwd)"
date
ENDSSH

实际应用示例

示例1:部署脚本

bash 复制代码
#!/bin/bash
# deploy.sh

REMOTE_USER="deploy"
REMOTE_HOST="192.168.1.100"
SCRIPT_PATH="/home/deploy/deploy.sh"

ssh $REMOTE_USER@$REMOTE_HOST << 'EOF'
cd /home/deploy/app
git pull origin main
npm install
sudo systemctl restart myapp
echo "部署完成 at $(date)"
EOF

示例2:带变量的远程执行

bash 复制代码
#!/bin/bash
# remote_backup.sh

REMOTE_USER="admin"
REMOTE_HOST="server.example.com"
BACKUP_DIR="/backup"

ssh $REMOTE_USER@$REMOTE_HOST "
    echo '开始备份...'
    tar -czf $BACKUP_DIR/backup-$(date +%Y%m%d).tar.gz /var/www
    ls -lh $BACKUP_DIR/
    echo '备份完成'
"

示例3:交互式脚本执行

bash 复制代码
#!/bin/bash
# interactive_script.sh

read -p "输入远程主机: " host
read -p "输入用户名: " user
read -p "输入要执行的命令: " command

ssh $user@$host "$command"

高级用法和技巧

1. 使用SSH密钥认证(免密码)

bash 复制代码
# 生成SSH密钥对
ssh-keygen -t rsa

# 复制公钥到远程主机
ssh-copy-id username@remote_host

# 现在可以免密码执行
ssh username@remote_host './script.sh'

2. 后台执行长时间任务

bash 复制代码
# 使用nohup在后台执行
ssh username@remote_host 'nohup /path/to/long_running_script.sh > output.log 2>&1 &'

3. 传输文件并执行

bash 复制代码
# 先传输脚本,再执行
scp script.sh username@remote_host:/tmp/
ssh username@remote_host 'chmod +x /tmp/script.sh && /tmp/script.sh'

4. 带环境变量的执行

bash 复制代码
# 设置环境变量并执行
ssh username@remote_host "export PATH=/usr/local/bin:\$PATH; ./script.sh"

5. 错误处理和返回值

bash 复制代码
#!/bin/bash

ssh username@remote_host '/path/to/script.sh'

# 检查上一条命令的退出状态
if [ $? -eq 0 ]; then
    echo "远程脚本执行成功"
else
    echo "远程脚本执行失败"
    exit 1
fi

安全注意事项

  1. 使用SSH密钥认证代替密码认证
  2. 限制远程用户的权限
  3. 验证远程脚本的来源和内容
  4. 使用引号正确处理特殊字符
  5. 考虑使用SSH配置文件简化连接

SSH配置文件示例

bash 复制代码
# ~/.ssh/config
Host myserver
    HostName 192.168.1.100
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_rsa

# 简化后的执行命令
ssh myserver './deploy.sh'

选择适合你需求的方法,对于简单的命令使用方法1,对于复杂的多行脚本使用方法3或4。