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
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()
|
로그인 후 복사
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()
|
로그인 후 복사
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()
|
로그인 후 복사
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()
|
로그인 후 복사
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!