ssh遠程執行命令並自動退出


ssh命令格式如下:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

主要參數說明:

-l 指定登入用戶

-p 設置端口號

-f 后台運行,並推薦加上 -n 參數

-n 將標准輸入重定向到 /dev/null,防止讀取標准輸入

-N 不執行遠程命令,只做端口轉發

-q 安靜模式,忽略一切對話和錯誤提示

-T 禁用偽終端配置


ssh 執行遠程命令格式:

ssh [options][remote host][command]

假設遠程服務器IP是192.168.110.34

例:查看遠程服務器的cpu信息

ssh -l www-online 192.168.110.34 "cat /proc/cpuinfo"

www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "cat /proc/cpuinfo"
www-online@192.168.110.34's password:
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 26
model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
stepping        : 5
cpu MHz         : 2128.000
cache size      : 4096 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm
bogomips        : 4256.00
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 26
model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
stepping        : 5
cpu MHz         : 2128.000
cache size      : 4096 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm
bogomips        : 4260.80
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

例:執行遠程服務器的sh文件

首先在遠程服務器的/home/www-online/下創建一個uptimelog.sh腳本

#!/bin/bash

uptime >> 'uptime.log'

exit 0
使用chmod增加可執行權限

chmod u+x uptimelog.sh
在本地調用遠程的uptimelog.sh

ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh"
執行完成后,在遠程服務器的/home/www-online/中會看到uptime.log文件,顯示uptime內容

www-online@nmgwww34:~$ tail -f uptime.log
21:07:34 up 288 days,  8:07,  1 user,  load average: 0.05, 0.19, 0.31

例:執行遠程后台運行sh

首先把uptimelog.sh修改一下,修改成循環執行的命令。作用是每一秒把uptime寫入uptime.log

#!/bin/bash

while :
do
  uptime >> 'uptime.log'
  sleep 1
done

exit 0
我們需要這個sh在遠程服務器以后台方式運行,命令如下:

ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &"

www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &"
www-online@192.168.110.34's password:

輸入密碼后,發現一直停住了,而在遠程服務器可以看到,程序已經以后台方式運行了。

www-online@nmgwww34:~$ ps aux|grep uptimelog.sh
1007     20791  0.0  0.0  10720  1432 ?        S    21:25   0:00 /bin/bash /home/www-online/uptimelog.sh
原因是因為uptimelog.sh一直在運行,並沒有任何返回,因此調用方一直處於等待狀態。

我們先kill掉遠程服務器的uptimelog.sh進程,然后對應此問題進行解決。


ssh 調用遠程命令后不能自動退出解決方法

可以將標准輸出與標准錯誤輸出重定向到/dev/null,這樣就不會一直處於等待狀態。

ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh > /dev/null 2>&1 &"

www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh > /dev/null 2>&1 &"
www-online@192.168.110.34's password:
www-online@onlinedev01:~$

但這個ssh進程會一直運行在后台,浪費資源,因此我們需要自動清理這些進程。


實際上,想ssh退出,我們可以在ssh執行完成后kill掉ssh這個進程來實現。

首先,創建一個sh執行ssh的命令,這里需要用到ssh的 -f -n 參數,因為我們需要ssh也以后台方式運行,這樣才可以獲取到進程號進行kill操作。

創建ssh_uptimelog.sh,腳本如下

#!/bin/bash

ssh -f -n -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &" # 后台運行ssh

pid=$(ps aux | grep "ssh -f -n -l www-online 192.168.110.34 /home/www-online/uptimelog.sh" | awk '{print $2}' | sort -n | head -n 1) # 獲取進程號

echo "ssh command is running, pid:${pid}"

sleep 3 && kill ${pid} && echo "ssh command is complete" # 延遲3秒后執行kill命令,關閉ssh進程,延遲時間可以根據調用的命令不同調整

exit 0
可以看到,3秒后會自動退出

www-online@onlinedev01:~$ ./ssh_uptimelog.sh
www-online@192.168.110.34's password:
ssh command is running, pid:10141
ssh command is complete
www-online@onlinedev01:~$
然后查看遠程服務器,可以見到uptimelog.sh 在后台正常執行。

www-online@nmgwww34:~$ ps aux|grep uptime
1007     28061  0.1  0.0  10720  1432 ?        S    22:05   0:00 /bin/bash /home/www-online/uptimelog.sh
查看uptime.log,每秒都有uptime數據寫入。
www-online@nmgwww34:~$ tail -f uptime.log
22:05:44 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
22:05:45 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
22:05:46 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
22:05:47 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
22:05:48 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM