python 执行 shell命令 的几

发布时间:2019-08-27 08:03:24编辑:auto阅读(1732)

     

    Python 执行 shell 命令

     

    os.system

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system

    os.system('cat /proc/cpuinfo')

    但是发现页面上打印的命令执行结果 0 或者 1,当然不满足需求了。

     

    os.popen()

    尝试第二种方案 os.popen()

    output = os.popen('cat /proc/cpuinfo')
    print output.read()

    通过os.popen()返回的是 file read 的对象,对其进行读取 read() 操作可以看到执行的输出。但是无法读取程序执行的返回值。

     

    commands.getstatusoutput()

    尝试第三种方案 commands.getstatusoutput() 一个方法就可以获得到返回值和输出,非常好用。

    (status, output) = commands.getstatusoutput('cat /proc/cpuinfo')
    print status, output

     

    Python Document 中给的一个例子,

    >>> import commands
    >>> commands.getstatusoutput('ls /bin/ls')
    (0, '/bin/ls')
    >>> commands.getstatusoutput('cat /bin/junk')
    (256, 'cat: /bin/junk: No such file or directory')
    >>> commands.getstatusoutput('/bin/junk')
    (256, 'sh: /bin/junk: not found')
    >>> commands.getoutput('ls /bin/ls')
    '/bin/ls'
    >>> commands.getstatus('/bin/ls')
    '-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'

    python commands 模块在 python3.x 被 subprocess 取代

    https://blog.csdn.net/ronnyjiang/article/details/53333538

     

     

    使用 paramiko 连接ssh 远程主机 执行 shell 命令

     

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,

    值得一说的是,fabric ansible 内部的远程管理就是使用的paramiko来现实。

    《Python自动化运维技术与最佳实践》

     

    下载安装

    由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto

    pip3 install pycrypto
    pip3 install paramiko

    使用示例:

    import paramiko
    
    if __name__ == '__main__':
    
        ip = '172.28.11.132' 
        port = 22           
        user_name = "root"  
        user_password = r'123456' 
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
        ssh.connect(ip, port, user_name, user_password)
        cmd = 'ls /'
        stdin, stdout, stderr = ssh.exec_command(cmd)
        print stdout.readlines()

     

    模块使用

     

    执行命令,用户名+密码

    #!/usr/bin/env python3
    #执行命令,用户名+密码
    
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('192.168.101.2', 22, "root", '111111')
    stdin, stdout, stderr = ssh.exec_command('df')
    
    print(stdout.read())
    ssh.close()
    

    执行命令:python3 paramiko_test01.py 

     

    执行命令,密钥

    #!/usr/bin/env python3
    #执行命令,密钥
    
    import paramiko
    private_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(private_key_path)
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('192.168.101.2', 22, 'root', '111111')
    
    stdin, stdout, stderr = ssh.exec_command('df')
    print(stdout.read())
    ssh.close()

     

    上传或下载文件,用户名+密码

    #!/sur/bin/env python3
    #上传或下载文件,用户名+密码
    
    import paramiko
    import os,sys
    
    t = paramiko.Transport(('192.168.101.2', 22))
    t.connect(username='root',password='111111')
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('/tmp/test.py','/tmp/test.py') #第一个参数是本地上传的文件,第二个参数>时上传后目标机器保存的文件
    t.close()

     

    下载或上传文件,密钥

    #!/usr/bin/env python3
    #下载或上传文件,密钥
    
    import paramiko
    pravie_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from+private_key_file(pravie_key_path)
    
    t = paramiko.Transport(('192.168.101.2', 22))
    t.connect(username='root',pkey=key)
    
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('/tmp/test2.py', '/tmp/test2.py')
    
    t.close()

     

     

     

     

     

     

关键字