Python을 통해 Linux 원격 로그인 및 SFTP를 구현하는 방법

王林
풀어 주다: 2023-05-11 17:55:19
앞으로
1800명이 탐색했습니다.
1. 셸 명령
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"
로그인 후 복사

을 사용하면 출력에 필요하지 않지만 제거할 수 없는 많은 정보가 포함되어 있음을 알 수 있습니다.
셸 명령의 경우 파이프를 직접 사용하거나 표준 출력을 파일로 리디렉션하여 실행 결과를 얻을 수 있습니다.

2. 하위 프로세스 사용

파이썬을 통해 os.popen, os.system, Commands, subprocess 등과 같은 일부 명령 실행 라이브러리를 사용하여 시스템 정보를 간접적으로 얻는 것을 생각할 수 있습니다. 이러한 라이브러리에서 얻은 출력에는 표준 출력뿐만 아니라 표준 오류 정보도 포함되어 있습니다. 따라서 원하는 데이터를 얻으려면 매번 출력을 정리하고 형식을 지정해야 합니다.

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 연결을 재사용할 수 없으며 하나의 연결은 하나의 명령만 실행할 수 있습니다

  • 코드는 모든 플랫폼에서 사용할 수 없으며 사용할 수만 있습니다. Linux 및 OSX

3. Paramiko
  • Installation

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿