【问题标题】:How can I use putty.exe with python to run remote unix commands like "mail" "cat" etc? [duplicate]如何将 putty.exe 与 python 一起使用来运行远程 unix 命令,如“mail”“cat”等? [复制]
【发布时间】:2017-01-31 11:37:45
【问题描述】:

如何使用 putty.exe 和 python 来运行远程 unix 命令,如“mail”“cat”等? 我的 unix 机器上有一个文件,我想将该文件内容作为电子邮件发送

【问题讨论】:

    标签: python putty


    【解决方案1】:

    你没有

    (或者至少你不应该)

    ...改为使用paramiko

    这是我与 paramiko 一起使用的辅助类(参见底部的示例使用)...我很确定我在几年前的其他一些堆栈溢出答案中找到了这个类的大部分内容

    from contextlib import contextmanager
    import os
    import re
    import paramiko
    import time
    
    
    class SshClient:
        """A wrapper of paramiko.SSHClient"""
        TIMEOUT = 10
    
        def __init__(self, connection_string,**kwargs):
            self.key = kwargs.pop("key",None)
            self.client = kwargs.pop("client",None)
            self.connection_string = connection_string
            try:
                self.username,self.password,self.host = re.search("(\w+):(\w+)@(.*)",connection_string).groups()
            except (TypeError,ValueError):
                raise Exception("Invalid connection sting should be 'user:pass@ip'")
            try:
                self.host,self.port = self.host.split(":",1)
            except (TypeError,ValueError):
                self.port = "22"
            self.connect(self.host,int(self.port),self.username,self.password,self.key)
        def reconnect(self):
            self.connect(self.host,int(self.port),self.username,self.password,self.key)
    
        def connect(self, host, port, username, password, key=None):
            self.client = paramiko.SSHClient()
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.client.connect(host, port, username=username, password=password, pkey=key, timeout=self.TIMEOUT)
    
        def close(self):
            if self.client is not None:
                self.client.close()
                self.client = None
    
        def execute(self, command, sudo=False,**kwargs):
            should_close=False
            if not self.is_connected():
                self.reconnect()
                should_close = True
            feed_password = False
            if sudo and self.username != "root":
                command = "sudo -S -p '' %s" % command
                feed_password = self.password is not None and len(self.password) > 0
            stdin, stdout, stderr = self.client.exec_command(command,**kwargs)
            if feed_password:
                stdin.write(self.password + "\n")
                stdin.flush()
    
            result = {'out': stdout.readlines(),
                    'err': stderr.readlines(),
                    'retval': stdout.channel.recv_exit_status()}
            if should_close:
                self.close()
            return result
    
        @contextmanager
        def _get_sftp(self):
            yield paramiko.SFTPClient.from_transport(self.client.get_transport())
    
        def put_in_dir(self, src, dst):
            if not isinstance(src,(list,tuple)):
                src = [src]
            print self.execute('''python -c "import os;os.makedirs('%s')"'''%dst)
            with self._get_sftp() as sftp:
                for s in src:
                    sftp.put(s, dst+os.path.basename(s))
    
        def get(self, src, dst):
            with self._get_sftp() as sftp:
                sftp.get(src, dst)
        def rm(self,*remote_paths):
            for p in remote_paths:
                self.execute("rm -rf {0}".format(p),sudo=True)
        def mkdir(self,dirname):
            print self.execute("mkdir {0}".format(dirname))
        def remote_open(self,remote_file_path,open_mode):
            with self._get_sftp() as sftp:
                return sftp.open(remote_file_path,open_mode)
    
        def is_connected(self):
            transport = self.client.get_transport() if self.client else None
            return transport and transport.is_active()
    if __name__ == "__main__":
        s = SshClient("user:password@192.168.1.125")
        print s.execute("ls")
        print s.execute("ls /etc",sudo=True)
    

    【讨论】:

      【解决方案2】:

      subprocess 模块正是您要寻找的。​​p>

      这是一个有用的使用教程http://sharats.me/the-ever-useful-and-neat-subprocess-module.html

      除此之外,如果没有具体细节,我们不会对您有太大帮助。

      【讨论】:

      • 这对子进程来说真的很痛苦......我很确定putty没有提供运行远程命令的命令行选项(你可以将远程命令放在一个文件中并给它文件名......我猜这会有点工作)+1都是一样的......但实现起来会很痛苦
      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多