转自:http://blog.csdn.net/fdipzone/article/details/23000201

ssh命令格式如下:

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

主要参数说明:

-l 指定登入用户

-p 设置端口号

-f 后台运行,并推荐加上 -n 参数

-n 将标准输入重定向到 /dev/null,防止读取标准输入

-N 不执行远程命令,只做端口转发

-q 安静模式,忽略一切对话和错误提示

-T 禁用伪终端配置

ssh 执行远程命令格式:

  1. ssh [options][remote host][command]

假设远程服务器IP是192.168.110.34

例:查看远程服务器的cpu信息

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

  1. www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "cat /proc/cpuinfo"
  2. www-online@192.168.110.34's password:
  3. processor       : 0
  4. vendor_id       : GenuineIntel
  5. cpu family      : 6
  6. model           : 26
  7. model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
  8. stepping        : 5
  9. cpu MHz         : 2128.000
  10. cache size      : 4096 KB
  11. fpu             : yes
  12. fpu_exception   : yes
  13. cpuid level     : 11
  14. wp              : yes
  15. 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
  16. bogomips        : 4256.00
  17. clflush size    : 64
  18. cache_alignment : 64
  19. address sizes   : 40 bits physical, 48 bits virtual
  20. power management:
  21. processor       : 1
  22. vendor_id       : GenuineIntel
  23. cpu family      : 6
  24. model           : 26
  25. model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
  26. stepping        : 5
  27. cpu MHz         : 2128.000
  28. cache size      : 4096 KB
  29. fpu             : yes
  30. fpu_exception   : yes
  31. cpuid level     : 11
  32. wp              : yes
  33. 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
  34. bogomips        : 4260.80
  35. clflush size    : 64
  36. cache_alignment : 64
  37. address sizes   : 40 bits physical, 48 bits virtual
  38. power management:

例:执行远程服务器的sh文件

首先在远程服务器的/home/www-online/下创建一个uptimelog.sh脚本

  1. #!/bin/bash
  2. uptime >> 'uptime.log'
  3. exit 0

使用chmod增加可执行权限

  1. chmod u+x uptimelog.sh

在本地调用远程的uptimelog.sh

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

执行完成后,在远程服务器的/home/www-online/中会看到uptime.log文件,显示uptime内容

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

例:执行远程后台运行sh

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

  1. #!/bin/bash
  2. while :
  3. do
  4. uptime >> 'uptime.log'
  5. sleep 1
  6. done
  7. exit 0

我们需要这个sh在远程服务器以后台方式运行,命令如下:

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

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

输入密码后,发现一直停住了,而在远程服务器可以看到,程序已经以后台方式运行了。

  1. www-online@nmgwww34:~$ ps aux|grep uptimelog.sh
  2. 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 &"

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

但这个ssh进程会一直运行在后台,浪费资源,因此我们需要自动清理这些进程。

实际上,想ssh退出,我们可以在ssh执行完成后kill掉ssh这个进程来实现。

首先,创建一个sh执行ssh的命令,这里需要用到ssh的 -f 与 -n 参数,因为我们需要ssh也以后台方式运行,这样才可以获取到进程号进行kill操作。

创建ssh_uptimelog.sh,脚本如下

  1. #!/bin/bash
  2. ssh -f -n -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &" # 后台运行ssh
  3. 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) # 获取进程号
  4. echo "ssh command is running, pid:${pid}"
  5. sleep 3 && kill ${pid} && echo "ssh command is complete" # 延迟3秒后执行kill命令,关闭ssh进程,延迟时间可以根据调用的命令不同调整
  6. exit 0

可以看到,3秒后会自动退出

  1. www-online@onlinedev01:~$ ./ssh_uptimelog.sh
  2. www-online@192.168.110.34's password:
  3. ssh command is running, pid:10141
  4. ssh command is complete
  5. www-online@onlinedev01:~$

然后查看远程服务器,可以见到uptimelog.sh 在后台正常执行。

  1. www-online@nmgwww34:~$ ps aux|grep uptime
  2. 1007     28061  0.1  0.0  10720  1432 ?        S    22:05   0:00 /bin/bash /home/www-online/uptimelog.sh

查看uptime.log,每秒都有uptime数据写入。

  1. www-online@nmgwww34:~$ tail -f uptime.log
  2. 22:05:44 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
  3. 22:05:45 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
  4. 22:05:46 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
  5. 22:05:47 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08
  6. 22:05:48 up 288 days,  9:05,  1 user,  load average: 0.01, 0.03, 0.08

ssh远程执行命令并自动退出(已测试通过)的更多相关文章

  1. Linux:ssh远程执行命令并自动退出

    ssh命令格式: [root@localhost ~]# ssh --helpusage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c ...

  2. ssh远程执行命令并自动退出

    usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [ ...

  3. SSH远程执行命令环境变量问题

    SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...

  4. 解决SSH远程执行命令找不到环境变量的问题

    通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同, ...

  5. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  6. [转帖]ssh 远程执行命令

    ssh 远程执行命令 https://www.cnblogs.com/youngerger/p/9104144.html SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是 ...

  7. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令

    利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...

  8. ssh远程执行命令使用明文密码

    经过不懈的搜索终于找到ssh远程执行命令使用明文密码使用sshpass. 例子: sshpass -p "sequoiadb" ssh root@localhost "l ...

  9. 模拟ssh远程执行命令,粘包问题,基于socketserver实现并发的socket

    06.27自我总结 1.模拟ssh远程执行命令 利用套接字编来进行远程执行命令 服务端 from socket import * import subprocess server = socket(A ...

随机推荐

  1. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  2. BT之下拉菜单

    <div class="dropdown"> <button class="btn btn-default dropdown-toggle" ...

  3. excl剔除不合格数据求平均值

    excl剔除不合格数据求平均值 trimmean函数 正态分布: CONFIDENCE.NORM 函数

  4. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  5. CocoaPods安装和使用及问题:Setting up CocoaPods master repo

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...

  6. html5 全屏滚动活动页学习

    先看几个具体的实例: 1.腾讯娱乐:http://ent.qq.com/zt2014/qqent/h5.htm?from=groupmessage&isappinstalled=0 2.苏宁互 ...

  7. discuz 注册用户用到的几个表

    通过开启记录:mysql记录日志,筛出如下信息: INSERT INTO `userclub`.pre_ucenter_members SET secques='', username='pthlp1 ...

  8. PHP中CURL技术模拟登陆抓取网站信息,用与微信公众平台成绩查询

    伴随微信的红火,微信公众平台成为许多开发者的下一个目标.笔者本身对于这种新鲜事物没有如此多的吸引力.但是最近有朋友帮忙开发微信公众平台中一个成绩查询的功能.于是便在空余时间研究了一番. 主要的实现步骤 ...

  9. 拓展,Fibonacci螺旋

    #该程序由023递归这课中的fibonacci数列递归写法修改而成 #在写的过程中发现,如果要正确引导用户的每一次输入,写的代码比主程序还要多 #当然,为了使程序在用户交互过程中显得更加友好,提供错误 ...

  10. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)

    使用 HttpRequest 对象 HttpRequest 对象描述的是一个正在被处理的 HTTP 请求.下表列举了 HttpRequest 中的属性,它们提供了当前请求的相关信息(HttpReque ...