ホームページ  >  記事  >  運用・保守  >  Python を使用して Linux リモート ログインと SFTP を実装する方法

Python を使用して Linux リモート ログインと SFTP を実装する方法

王林
王林転載
2023-05-11 17:55:191802ブラウズ
1. シェル コマンド
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

を使用します。すると、出力には、不要ではあるが削除できない情報が多数含まれていることがわかります。
シェル コマンドの場合、パイプを直接使用するか、標準出力をファイルにリダイレクトして実行結果を取得できます。

2. サブプロセスを使用する

Python を通じて、os.popen、os.system、コマンド、サブプロセスなどのコマンド実行ライブラリを使用して、システム情報を間接的に取得することが考えられます。これらのライブラリによって取得される出力には、標準出力だけでなく、標準エラー情報も含まれます。したがって、必要なデータを取得するには、毎回出力をクリーンアップしてフォーマットする必要があります。

import subprocess 
ssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx  'ls -l'" 
status, output = subprocess.getstatusoutput(ssh_cmd) 
# 数据清理

要するに、ssh コマンドを間接的に使用するといくつかの問題があります:

  • 追加の sshpass をインストールする必要がある (パスワードが必要ない場合)

  • 干渉情報が多すぎるため、データのクリーニングとフォーマットが非常に面倒です

  • コードの実装が十分に洗練されておらず、可読性が低すぎます

  • #ssh 接続 再利用できません。コマンドは接続ごとに 1 回のみ実行できます。

  • ##コードはすべてのプラットフォームで使用できるわけではなく、Linux と Linux でのみ使用できます。 OSX
  • ##3. Paramiko を使用する
インストール
  • python3 -m pip install
方法 1 : ユーザー名とパスワードに基づいて sshclient 経由でログインします
    この方法では ssh 接続を再利用できません。

  • import paramiko 
     
    ssh = paramiko.SSHClient() 
    # 允许连接不在know_hosts文件中的主机 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     
    # 建立连接 
    ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") 
     
    # 使用这个连接执行命令 
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
     
    # 获取输出 
    print(ssh_stdout.read()) 
     
    # 关闭连接 
    ssh.close()
方法 2: ユーザー名とパスワードに基づくトランスポート モード ログイン
  • この方法では、接続を再利用できます。


    import paramiko 
     
    # 建立连接 
    trans = paramiko.Transport(("xx.xx.xx.xx", 22)) 
    trans.connect(username="root", password="you_passwd") 
    
    ssh = paramiko.SSHClient() 
    ssh._transport = trans 
     
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
    print(ssh_stdout.read()) 
     
    # 关闭连接 
    trans.close()
方法 3: 公開キーに基づく SSHClient ログイン
    この方法では、ssh 接続を再利用できません。

  • import paramiko 
     
    # 指定本地的RSA私钥文件 
    # 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。
    pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
     
    # 建立连接 
    ssh = paramiko.SSHClient() 
    ssh.connect(hostname='xx.xx.xx.xx', 
                port=22, 
                username='you_username', 
                pkey=pkey) 
     
    # 执行命令 
    stdin, stdout, stderr = ssh.exec_command('ls -l') 
     
    # 结果放到stdout中,如果有错误将放到stderr中 
    print(stdout.read()) 
     
    # 关闭连接 
    ssh.close()
方法 4: 公開キーに基づくトランスポート モード ログイン
  • この方法では、接続を再利用できます。


    import paramiko 
     
    # 指定本地的RSA私钥文件 
    # 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。 
    pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
     
    # 建立连接 
    trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
    trans.connect(username='you_username', pkey=pkey) 
    
    ssh = paramiko.SSHClient() 
    ssh._transport = trans 
     
    # 执行命令,和传统方法一样 
    stdin, stdout, stderr = ssh.exec_command('df -hl') 
    print(stdout.read().decode()) 
     
    # 关闭连接 
    trans.close()
sftp ファイル転送
  • import paramiko 
     
    trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
     
    # 建立连接 
    trans.connect(username='you_username', password='you_passwd') 
     
    # 实例化一个 sftp对象,指定连接的通道 
    sftp = paramiko.SFTPClient.from_transport(trans) 
     
    # 发送文件 
    sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') 
     
    # 下载文件 
    sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') 
    trans.close()

以上がPython を使用して Linux リモート ログインと SFTP を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。