2011-10-01 6 views
2

파이썬을 사용하여 SSH를 통해 다른 서버에 연결하고, 소수의 명령을 실행하고 각 명령의 결과를 각기 다른 변수에 할당해야합니다.
가장 간단한 방법은 무엇입니까?
나는 SSHController을 시도했지만, 나는 프롬프트와 함께 뭔가를 망쳤으며, 스크립트는 끝없이 그것을 기다리고있다.
모든 사례에 대해 매우 감사하겠습니다.파이썬에서 SSH 사용하기

답변

13

파이썬에서 SSH를 사용하는 방법에는 여러 가지가 있습니다. 일반적인 접근법은 다음 pexpect 또는 유사한 PTY (사이비-TTY를 사용 ssh 로컬 이진 제어

  • 전화 (에만 배치의 결과를 수집하기위한 적당한) 및 subprocess.Popen() 또는 유사한을 사용

    • 통화 로컬 ssh 이진) 프로세스 제어 메커니즘 (자동화 된 방식으로 터미널 세션에서 프로세스 생성 및 상호 작용을 위해)
    • Paramiko 또는 Twisted conch과 같은 Python 모듈/라이브러리를 사용하면 SSH 프로토콜을 구현합니다 (직접 기본 Python으로 제공하거나 기본 공유 라이브러리에 대한 바인딩 .so 또는 DLL).

    SSHController는이 두 번째 범주에 속합니다. 내 자신의 겸손한 유틸리티, classh 첫 번째 범주에 있습니다.

    귀하의 질문은 원격 프로세스 실행의 결과를 기반으로 로컬 변수 상태를 설정하려는 것처럼 들릴 수 있으므로 Paramiko을 살펴 보는 것이 가장 좋습니다. 원격 명령의 결과와 함께 어떤 종류의 로컬 터미널 출력이나 오류 메시지와도 충돌하는 것을 원하지 않는다고 생각합니다.

    다른 말로하면 명령 유틸리티로 ssh이 아닌 SSH를 API로 사용하려는 것 같습니다. 이것은 필수적인 구분입니다.

    ssh 명령은 UNIX (및 유사한 MS Windows 등) 환경에서 허용하는 것처럼 투명합니다. ssh은 원격 시스템에 대한 연결을 열고 원격 작업 실행이 통신하는 여러 채널을 생성합니다. 그래서 로컬 ssh표준 출력은 원격 명령 '표준 출력에서 될 것이며 지역 ssh표준 에러는 같은 원격의 표준 에러의 혼합물과 ssh 명령 자신의 오류 메시지 (및 기타 출력의 될 것 ssh 호출에 -v, --verbose 옵션을 추가 할 때 표시되는 디버깅 정보). 마찬가지로 ssh 명령의 종료 상태는 일반적으로 원격 쉘의 종료 상태를 반영합니다. 그러나 그것은 로컬 오류에서 로컬 ssh 프로세스 '자신의 종료 코드가 될 수도 있습니다 --- 내 경험에 의하면 항상 255 값인 것 같습니다. 원격 명령의 종료 값 255를 구별 할 수있는 방법이 없습니다. 대 지역 프로세스의 "비정상 종료 (abend)"(비정상적인 프로세스 종료)와 나는 그렇게 할 수있는 이식 가능한 표준 방법이 없다고 생각합니다.

    여기 내 요점은 코드 내에서 ssh 명령을 사용하면 로컬 프로세스 (즉, ssh 바이너리 자체 및 사용자의 실행 방식, 로컬 셸)과 원격 프로세스 (그리고 의도 한 원격 프로세스가 실행중인 셸)에서 생성 된 것입니다.ssh은 API가 아닙니다.

    반면에 Paramiko와 같은 것을 사용하면 SSH 프로토콜을 통한 세션을 설정하고 을 사용하고 명령을 실행하고, 파일을 전송하고, 다른 파일 시스템 기능을 수행하고, 다시 작성하여을 재사용 할 수 있습니다. 터널.

    그런 경우 SSHClient 인스턴스를 만들고 원격 호스트에서 실행할 각 명령에 대해 .exec_command() 메서드를 호출하십시오. 이것은 개념적으로 로컬 함수 호출을 만드는 것과 비슷합니다. 어떤 이유로 든 명령을 실행할 수 없으면 예외가 발생합니다 ... stdout 또는 stderr은 가능한 경우에 병합 할 수 없습니다 중간 프로세스 (예 :이 경우에는 전혀 실행되지 않는 ssh 바이너리)에서 출력됩니다.

    그래서이 방법을 권장합니다. ssh 유틸리티에 대한 단일 호출에서 모든 호출을 수행하여 발생할 수있는 복잡성을 없애고 여러 호출을 ssh 호출로 복잡성과 성능 오버 헤드없이 수행하는 방식으로 각 원격 대상에서 몇 가지 개별 명령을 실행하려는 것처럼 들립니다. 세션을 설정하고이를 API로 사용할 수 있다면 코드가 훨씬 간단하고 강력해진 것처럼 들립니다.

  • +0

    paramiko에 문제가 있습니다. folowing error가 발생합니다 : Crypto에서 가져 오기 SHA256 ImportError : 이름 SHA256을 가져올 수 없습니다. 어떻게 해결할 수 있습니까? 나는 물건을 설치할 수있는 권한이 없으며 파일 만 내 홈 폴더에 복사합니다. – Djent

    +0

    @Djent : 가상 환경을 설정할 수 있습니다 (자세한 정보는 "Python virtualenv"에서 검색하십시오). 이것은 약간 복잡 할 수 있지만 작업중인 각 프로젝트에 대한 고유 한 Python 버전과 종속성을 구성 할 수있는 방법이 될 것입니다. –