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

ssh命令格式以下:api

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 指定登入用戶
bash

-p 設置端口號
服務器

-f 後臺運行,並推薦加上 -n 參數
ssh

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

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

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

-T 禁用僞終端配置
code


ssh 執行遠程命令格式:
blog

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
相關文章
相關標籤/搜索