Linux以守护进程方式,执行ssh远程连接和scp命令(含脚本)

本文介绍了两种在Linux下以守护进程方式执行ssh和scp命令的方法,包括使用nohup和setsid,并提供了确保后台进程全部执行完毕的shell脚本示例,适用于多命令执行场景,适用于运维学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一

1.nohup + ssh + &
nohup ssh root@10.0.0.101 "command01; command02; command03" &

2.setsid + ssh +&
setsid ssh root@10.0.0.101 "command01; command02; command03" &

方式二(推荐 适合多命令)

1.nohup + ssh +&
nohup ssh root@10.0.0.101<< EOF &
command01 选项1 选项2 ...
command02 选项1 选项2 ...
command03 选项1 选项2 ...
EOF

2.setsid + ssh +&
setsid ssh root@10.0.0.101 << EOF &
command01 选项1 选项2 ...
command02 选项1 选项2 ...
command03 选项1 选项2 ...
EOF

★脚本(确保后台守护进程全部执行完毕,才可执行后续的远程管理操作)


#!/bin/bash

cat > hosts.list << EOF
10.0.0.102 root a123456!
10.0.0.103 root a123456!
EOF

which expect || yum install -y expect
expect << EOF      ##生成密钥自动应答
  spawn ssh-keygen
  expect {
    "*:"     {send "\r"; exp_continue}
    "*(y/n)?"{send "n\r"; exp_continue}
    eof
  }
EOF

##传输密钥
cat hosts.list | while read hostinfo; do
   host_ip=`echo $hostinfo | awk '{print $1}'`
   host_user=`echo $hostinfo | awk '{print $2}'`
   host_pass=`echo $hostinfo | awk '{print $3}'`
   expect << EOF
     spawn ssh-copy-id $host_user@$host_ip
     expect {
     "*(yes/no)?" {send "yes\n"; exp_continue}
     "*passw0rd:" {send "$host_passwd\n"; exp_continue}
     eof
     }
EOF
done

##无口令ssh登陆的环境已经OK
unset pid_num
i="0"
while read hostinfo; do
   host_ip=`echo $hostinfo | awk '{print $1}'`
   host_user=`echo $hostinfo | awk '{print $2}'`
   setsid ssh $host_user@$host_ip << EOF &
       timeout 60 ping -q 127.0.0.1
EOF
   pid_num[$i]="$!"
   ((i=i+1))
done < hosts.list

##开始检查后台执行的ssh远程管理是否全部执行结束
pid_sum=${#pid_num[*]}
while true; do
    for i in ${pid_num[*]}; do
        if ps -p $i; then
           echo "$i pid仍然存在"
        else
           echo "$i pid已消失"
           ((pid_sum=pid_sum-1))
        fi
    done
    if [[ $pid_sum -eq 0 ]]; then
       echo "全部完成"
       break
    fi
done

## 正常执行后续的ssh远程管理操作
cat hosts.list | while read hostinfo; do
    host_ip=`echo $hostinfo | awk '{print $1}'`
    host_user=`echo $hostinfo | awk '{print $2}'`
    ssh $host_user@$host_ip << EOF
        echo "远程主机名 \$HOSTNAME 的当前系统时间为 \$(date)"
    EOF
done

此代码为老师上课写出供学习shell脚本的
仅供学习,禁止用于其他用途

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值