> 운영 및 유지보수 > 리눅스 운영 및 유지 관리 > Python을 통해 Linux 원격 로그인 및 SFTP를 구현하는 방법

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

王林
풀어 주다: 2023-05-11 17:55:19
앞으로
1960명이 탐색했습니다.
1. 셸 명령

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

1

2

3

4

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

1

python3 -m pip install

로그인 후 복사
  • 사용 방법 1: 사용자 이름과 비밀번호를 기반으로 sshclient를 통해 로그인
    이 방법은 SSH 연결을 재사용할 수 없습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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: 사용자 이름과 비밀번호를 기반으로 전송을 통해 로그인
    이 방법은 연결을 재사용할 수 있습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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 연결을 재사용할 수 없습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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: 공개 키를 기반으로 한 전송 방법 로그인
    이 방법은 연결을 재사용할 수 있습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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 파일 전송

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

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