python socket 시 뮬 레이 션 기반 ssh 원 격 실행 명령

7081 단어 pythonsocketssh
1.subprocess.Popen()
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)
우 리 는 그 중의 몇 가지 매개 변수 에 만 관심 을 가 져 야 한다.
  • args:
  • args 인자.프로그램 매개 변 수 를 포함 하 는 문자열 일 수 있 습 니 다.실행 할 프로그램 은 일반적으로 이 목록 의 첫 번 째 항목 이나 문자열 자체 입 니 다.
  • shell=True:
  • Linux 에서 셸=True 일 때 arg 가 문자열 이 라면 셸 로 이 문자열 을 설명 합 니 다.args 가 목록 이 라면 첫 번 째 항목 은 명령 으로 간주 되 고 나머지 는 셸 자체 에 대한 인자 로 간주 된다.즉,다음 과 같다.
    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 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기