通过paramiko模块ssh登录linux,然后用exec_command方法执行带有nohup的shell命令不生效,python脚本如下:

import paramiko

import time

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('192.168.1.2', 22, 'root', '123456')

ssh.exec_command('nohup ping localhost & \n')

time.sleep(1)

脚本执行完之后ping进程并没有继续运行,这可能是因为exec_command执行完之后立刻关闭通道的原因,换用invoke_shell可以正常运行:

import paramiko

import time

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('192.168.1.2', 22, 'root', '123456')

chan = ssh.invoke_shell()

chan.send('nohup ping localhost & \n')

time.sleep(1)

注意,命令最后的回车\n和延时必不可少

补充知识:paramiko远程服务器nohup阻塞问题

一、需求描述:

需要来回切换多台服务器(脚本命令不太熟),就用了python的paramiko模块进行远程连接服务器,控制程序的停止和启动。安装:pip install paramiko

二、问题描述:

import paramiko

# 创建SSH对象

ssh = paramiko.SSHClient()

# 允许连接不在know_hosts文件中的主机

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器

ssh.connect(hostname='192.168.0.3', port=22, username='xxx')

# 执行命令

stdin, stdout, stderr = ssh.exec_command('cd ~/ ; nohup python3.6 run_test.py > nohup_test.log 2>&1 &')

# 获取命令结果

result = stdout.read()

# 关闭连接

ssh.close()

这样连接服务器的时候确实可以执行,但是遇到会阻塞的任务时,就无法生效,找了很多方法,最后发现这个比较有效。

三、解决方法

import paramiko

# 创建SSH对象

ssh = paramiko.SSHClient()

# 允许连接不在know_hosts文件中的主机

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器

ssh.connect(hostname='192.168.0.3', port=22, username='xxx', key=private_key)

# 添加下面代码

transport = ssh.get_transport()

channel = transport.open_session()

# 执行命令 此方法没有返回值

channel.exec_command('cd ~/ ; nohup python3.6 run_test.py > nohup_test.log 2>&1 &')

# 关闭连接

ssh.close()

四、类的调用实现:

简单测试,见下面代码

# -*- coding: utf-8 -*-

"""

20190330

"""

import paramiko

import time

from confs.log import logger # 自行导入logging模块即可

class EasyConnectHandle(object):

"""操作远程服务器"""

def __init__(self, connect_host_name:dict):

"""初始化参数"""

"""

"test":{

"ip":"192.168.0.189",

"user_name":"xxxx",

"pwd":"huhuhu"

},

"""

self.connect_host = connect_host_name

self.ssh = paramiko.SSHClient()

self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接陌生服务器

self.ssh.connect(hostname=self.connect_host["ip"], port=22, username=self.connect_host["user_name"],

password=self.connect_host["pwd"], timeout=10) # 初始化的时候连接到新的服务器

logger.info(f"登录服务器---{self.connect_host['ip']}成功:")

def __new__(cls, *args, **kwargs):

"""单例模式"""

if not hasattr(cls, '_instance'):

cls._instance = super(EasyConnectHandle, cls).__new__(cls)

return cls._instance

def exec(self, cmd=""):

"""执行操作"""

stdin, stdout, stderr = self.ssh.exec_command(cmd)

return stdout.read().decode()

def quit(self):

"""断开服务器"""

self.ssh.close()

logger.info(f"退出服务器---{self.connect_host['ip']}成功")

if __name__ == '__main__':

test_host = {

"test": {

"ip": "192.168.0.111",

"user_name": "xxxx",

"pwd": "xxxx",

"jobs": [

{

"path": "/home/lemon",

"type": "touch test_1.sh"

},

{

"path": "/home/lemon",

"type": "touch test_2.sh"

}

]

}

}

for i in ["test"]:

easy_conn = EasyConnectHandle(test_host[i])

transport = easy_conn.ssh.get_transport()

if len(test_host[i].get("jobs", [])) >= 1:

for job in test_host[i]["jobs"]:

channel = transport.open_session()

channel.exec_command(f"cd {job['path']};{job['type']}")

logger.info(f"服务器---{easy_conn.connect_host['ip']}执行---cd {job['path']};{job['type']}---成功")

time.sleep(2)

else:

logger.info(f"服务器---{easy_conn.connect_host['ip']}暂时没有任务")

easy_conn.quit()

以上这篇通过python 执行 nohup 不生效的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

python执行命令不阻塞_通过python 执行 nohup 不生效的解决相关推荐

  1. python编写命令行框架_使用 Python 和 Click 编写命令行应用程序

    简评:python 构建命令行应用的第三方比较有名的包除了 click 之外还有一个叫 docopt,这是一个以文档先行为目标的包.个人是比较倾向于 Click 的,看了这篇文章之后,也很快写了一个 ...

  2. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...

  3. CMD是什么?(命令行提示符)如何使用python在windows上操作CMD?(python执行命令行)os.syste[m](执行的命令)、os.popen(执行的命令)

    文章目录 cmd是什么 python操作cmd 方法1: 方法2: 20200309 cmd是什么 cmd是command的缩写.即命令提示行(CMD),是在OS / 2 , Win为基础的操作系统( ...

  4. python pdb查看变量值_使用Python中PDB模块中的命令来调试Python代码的教程

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...

  5. python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://www.jb51.net/it/692145.html,在这篇文章中,有这样一段话,吸引了我的注意: 在 Linux 中 ls 是 ...

  6. python中ls是什么_使用python实现ls命令(1)

    打算用python写一个ls命令脚本,以练习python基础.这个文档就是记录该小项目的进展和学习心得. ls是Linux下最常用的命令之一,可以列出目录内文件即子目录名,可以配合众多参数使用.为此专 ...

  7. python 的emulate函数封装_用模拟执行实现Objective-C代码自动化分析

    火眼高级逆向工程实验室脚本系列:用模拟执行实现Objective-C代码自动化分析 写在前面的话 京东安全开源的 qiling 是一个很不错的想法,但是唯一的问题在于它实现的东西太多,比较笨重.有的时 ...

  8. python基础知心得总结_【python】基础学习心得总结(一)

    本文将简单阐述一些基本的python知识点,大多是本人在学习过程中的心得体会.简单常用的编程概念和思想将不再描述.若有理解错误,还望指正. 一.python运行,调试 python和相关软件可以在官网 ...

  9. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  10. python程序运行结果不停_关于python:在进程运行时不断打印Subprocess输出

    要从我的python脚本启动程序,我使用以下方法: def execute(command): process = subprocess.Popen(command, shell=True, stdo ...

最新文章

  1. 如何禁止端口的使用(有空我把步骤图补上)
  2. PHP 提高PHP性能的编码技巧以及性能优化
  3. 我在海外做产品的1000 天:三大观察与学习
  4. Maven依赖方式引用UEditor的jar包
  5. 2010.11.13信息系统项目管理师考试下午试题答题思路剖析
  6. Ubuntu系统全盘备份与恢复,亲自总结,实测可靠
  7. mssql 批量导入mysql_mssql 数据库 批量导入指令
  8. VMware之以太网链接
  9. win10装系统--笔记
  10. java 显示数据库_java连接数据库并显示数据
  11. 拳王公社:网络操盘手必备的400款新媒体运营工具大全!
  12. java 主机字节序_java字节序、主机字节序和网络字节序扫盲贴
  13. 白盒/黑盒/灰盒测试的区别
  14. 关于7Z自解压文件拆分,读取条目,复写,合并的功能
  15. M1 Mac Ps2022如何不转译使用拓展插件
  16. 使用ajax传递数组
  17. HTML实现公告文字滚动效果
  18. 有什么能在网上挣钱的项目啊?做自媒体靠谱吗?
  19. win7 在任务栏左侧加个显示桌面的图标
  20. DOM系列——001-DOM基础

热门文章

  1. MySQL事务之可重复读
  2. NPM 上传自己的包
  3. 调研助力4S店,解码困境谜团
  4. POJ 1127_Jack Straws
  5. 快速开发jQuery插件的10大技巧(转)
  6. 兼容FireFox和IE8的设为首页和添加收藏
  7. 最常用的springmvc注解使用技巧
  8. MySQL二进制日志(binlog)总结
  9. RabbitMQ死信队列和备份交换器总结
  10. 构建自定义的同步工具