python socket 시 뮬 레이 션 기반 ssh 원 격 실행 명령
subprocess 모듈 은 클래스 를 정의 합 니 다:Popen
클래스 원형:
class subprocess.Popen( args,
bufsize = 0,
executable = None,
stdin = None,
stdout = None,
stderr = None,
preexec_fn = None,
close_fds = False,
shell = False,
cwd = None,
env = None,
universal_newlines = False,
startupinfo = None,
creationflags = 0)
우 리 는 그 중의 몇 가지 매개 변수 에 만 관심 을 가 져 야 한다.subprocess.Popen(['/bin/sh', '-c', args[0], args[1], ...])
stdin stdout 과 stderr:stdin stdout 과 stderr 는 서브루틴 의 표준 입력,표준 출력 과 표준 오 류 를 나타 낸다.선택 할 수 있 는 값 은 PIPE 또는 유효한 파일 설명자(사실은 정수)또는 파일 대상,그리고 None 입 니 다.PIPE 라면 새 파 이 프 를 만들어 야 한 다 는 뜻 입 니 다.None 이 라면 재 설정 작업 을 하지 않 습 니 다.하위 프로 세 스 의 파일 설명 자 는 부모 프로 세 스 를 계승 합 니 다.또한 stderr 의 값 은 STDOUT 일 수도 있 고 하위 프로 세 스 의 표준 오류 도 표준 출력 으로 출력 되 었 음 을 나타 낸다.
2.점착 현상
패 킷 문 제 는 수신 자가 메시지 간 의 경 계 를 모 르 고 시스템 캐 시 구역 의 문제 도 있 기 때 문 입 니 다.시간 차 이 는 몇 바이트 의 데 이 터 를 한꺼번에 추출 하 는 지 모 르 기 때 문 입 니 다.
주의사항:TCP 만 접착 현상 이 있 고 UDP 는 영원히 접착 되 지 않 습 니 다.
스티커 가 반드시 발생 하 는 것 은 아니다.만약 에 발생 한다 면:1.클 라 이언 트 가 이미 붙 었 을 것 이다.2.클 라 이언 트 가 붙 지 않 았 습 니 다.서버 에 붙 었 나 봐 요.
버퍼 역할:소량의 데 이 터 를 저장 합 니 다.
만약 당신 의 네트워크 에 짧 은 이상 이나 파동 이 발생 한다 면 수신 데 이 터 는 짧 은 중단 이 발생 하여 다운로드 나 업로드 의 효율 에 영향 을 줄 것 입 니 다.그렇지만
충전 구역 은 업로드 다운로드 의 전송 효율 문 제 를 해결 하여 접착 문 제 를 가 져 왔 다.
수발 의 본질:꼭 한 발 씩 받 는 것 은 아니다.
3.왜 끈 적 임 이 생 겼 어 요?
1.수신 자가 버퍼 의 패 키 지 를 제때에 받 지 않 아서 여러 개의 패 키 지 를 수신(클 라 이언 트 가 데 이 터 를 보 냈 습 니 다.서버 는 일부분 만 받 았 습 니 다.서버 가 다음 에 받 을 때 버퍼 에서 지난번 에 남 긴 데 이 터 를 가 져 와 서 패 키 지 를 만 들 었 습 니 다)recv 는 패 키 지 를 만 들 수 있 습 니 다(예 를 들 어 recv 가 받 은 데 이 터 량(1024)이 보 낸 데 이 터 량 보다 적 습 니 다.첫 번 째 는 규정된 데 이 터 량 1024 만 받 을 수 있 고,두 번 째 는 남 은 데 이 터 량 만 받 을 수 있다)
2.송신 단 은 버퍼 가 가득 차 야 발송 되 며 패 킷(송신 데이터 시간 간격 이 짧 고 데이터 도 작 으 며 합 쳐 져 패 킷 이 생 길 수 있 음)send 도 패 킷 현상 이 발생 할 수 있 습 니 다.(연속 send 소량의 데 이 터 를 출력 버퍼 에 보 냅 니 다.버퍼 의 메커니즘 으로 인해 버퍼 에 계속 쌓 일 수도 있 습 니 다.여러 번 기록 한 데 이 터 는 네트워크 에 한꺼번에 보 냅 니 다)
패 킷 현상 이 나타 난 코드 인 스 턴 스
server. py
import socket
import subprocess
#
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#
phone.bind(('127.0.0.1', 8081))
#
phone.listen(5)
#
while True:
#
conn, client_addr = phone.accept()
while True:
# /
cmd = conn.recv(1024)
if not cmd:
break
#
obj = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
#
conn.send(stdout)
conn.send(stderr)
#
conn.close()
#
phone.close()
client. py
import socket
#
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
phone.connect(('127.0.0.1', 8081))
while True:
cmd = input('>>> ').strip()
if not cmd:
continue
if cmd == 'quit':
break
# /
phone.send(cmd.encode('utf-8'))
# /
data = phone.recv(1024)
print(data.decode('utf-8'))
#
phone.close()
접착 현상 운행 결과ls 명령 을 두 번 실행 한 후에 도 서버 에서 ifconfig 명령 으로 돌아 온 결 과 를 관찰 할 수 있 습 니 다.마지막 ls 명령 의 끝 에 ls 명령 이 돌아 온 부분 결과 가 나 왔 습 니 다.
4.접착 문 제 를 해결 하 는 코드 인 스 턴 스
server. py
import socket
import subprocess
import json
import struct
#
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#
phone.bind(('127.0.0.1', 8081))
#
phone.listen(5)
#
while True:
#
conn, client_addr = phone.accept()
while True:
# /
cmd = conn.recv(1024)
if not cmd:
continue
#
obj = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
#
#
# 1.
header_dic = {
'filename': 'a.txt',
'total_size': len(stdout)+len(stderr)
}
#
header_json = json.dumps(header_dic) # byte
header_bytes = header_json.encode('utf-8') # utf-8(Mac )
# 2.
# 2.1 byte 4 int
conn.send(struct.pack('i', len(header_bytes)))
# 2.2
conn.send(header_bytes)
# 2.3
conn.send(stdout)
conn.send(stderr)
#
conn.close()
#
phone.close()
client. py
import socket
import struct
import json
#
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#
phone.connect(('127.0.0.1', 8081))
while True:
cmd = input('>>> ').strip()
if not cmd:
continue
if cmd == 'quit':
break
#
phone.send(cmd.encode('utf-8'))
#
# 1.
obj = phone.recv(4)
header_size = struct.unpack('i', obj)[0]
# 2.
header_bytes = phone.recv(header_size)
# 3. ( )
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
total_size = header_dic['total_size']
# 4.
recv_size = 0
recv_data = b''
while recv_size < total_size:
res = phone.recv(1024)
recv_data += res
recv_size += len(res)
print(recv_data.decode('utf-8'))
#
phone.close()
이상 은 python 이 socket 시 뮬 레이 션 을 바탕 으로 ssh 원 격 실행 명령 을 실현 하 는 상세 한 내용 입 니 다.python 이 socket 을 바탕 으로 ssh 원 격 실행 명령 을 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!이상 은 python 이 socket 시 뮬 레이 션 을 바탕 으로 ssh 원 격 실행 명령 을 실현 하 는 상세 한 내용 입 니 다.python socket 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.