로컬 입력을 사용하여 원격 서버에서 로컬 스크립트 실행

로컬 입력을 사용하여 원격 서버에서 로컬 스크립트 실행

스크립트 가 있고 pythonPython 스크립트가 입력 데이터를 사용합니다.

원격 서버에서 Python 스크립트를 실행하고 싶습니다.Python 스크립트와 데이터를 원격 서버에 복사할 필요가 없습니다..

나는 스크립트를 시도했다 :

ssh [email protected] "cd /home/dong/fold python -u -" <  script.py arg1

스크립트를 실행하지만 arg1(입력 데이터) Python 스크립트는 로컬 시스템에서 가져오지 않지만 입력 데이터가 원격 서버에 있을 때 작동합니다.

전문가들이 이 문제를 해결할 수 있는 몇 가지 방법을 제공할 수 있기를 바랍니다.

답변1

방법은 있지만 주의사항이 있습니다. 시도하기 전에 전체 답변을 읽어보십시오.

서버에 새 명명된 파이프(fifo)를 만듭니다.

ssh [email protected] 'cd /home/dong/fold && mkfifo myfifo'

명령이 거의 즉시 반환되어 성공했는지 확인해야 합니다. 이제 원격으로 실행되는 스크립트가 명명된 파이프를 사용할 파일로 처리하도록 합니다. 명령이 차단되어야 하며 예상대로 실행됩니다.

ssh [email protected] 'cd /home/dong/fold && python -u - myfifo' < script.py

위 명령이 기다리는 동안 로컬 머신에서 명명된 파이프를 입력합니다(분명히 다른 로컬 콘솔이 필요합니다).

ssh [email protected] 'cd /home/dong/fold && cat > myfifo' < arg1

그러면 이전 명령의 차단이 해제되고 이제 두 명령이 데이터를 전송해야 합니다.

참고 및 경고:

  • cdstdin은 소비되지 않으므로 local의 모든 항목은 script.py원격으로 이동 python하고 로컬의 모든 항목은 arg1원격으로 이동합니다 cat. 확실하지 않고 확실히 안전을 유지하고 싶다면 언제든지 cd중요한 데이터에서 표준 입력을 다른 방향으로 리디렉션할 수 있습니다( </dev/null cd …). 귀하의 경우에는 과잉입니다 cd. 그러나 어떤 이유로든 다른 도구를 연결하고 해당 도구가 표준 입력을 읽을 수 있는 경우 이 리디렉션이 트릭을 수행할 수 있습니다.

  • 쓰기 프로세스가 발생할 때까지 명명된 파이프에서 데이터 블록을 읽고, 읽기 프로세스가 발생할 때까지 명명된 파이프에서 데이터 블록을 씁니다. 즉, 순서에 관계없이 시작할 catpython있으며 추가로 동기화할 필요가 없습니다. (로컬) 셸 스크립트에서 솔루션을 구현하거나 단일 로컬 콘솔에서 모든 작업을 수행하려는 경우 ssh … cat …먼저 비동기식으로(즉, 백그라운드에서) 실행하는 것이 좋습니다. 서버에서 명명된 파이프를 사용하기 전에 명명된 파이프를 만드는 것이 중요하므로 mkfifo myfifo별도의 ssh명령을 입력합니다.

  • ssh서버에 대한 단일 연결을 통해 여러 프로그램을 실행할 수 있는 연결 공유 메커니즘이 있습니다 . 바라보다 man 1 ssh,-M그리고 -S옵션. 이는 인증을 위해 비밀번호를 사용하고 ssh백그라운드 에 무언가를 두고 싶지만 ssh -f이 목적으로 사용할 수 없는 경우에 특히 유용합니다(예: 암시 -n하고 싶지 않기 때문에 -n). 먼저 인증을 처리 ssh -fNMS …하고 백그라운드로 이동한 다음 ssh -S …원하는 만큼의 호출을 수행하고(백그라운드에서 가능) 마지막으로 실행하여 ssh -O exit -S …기본 연결을 종료합니다. 자세한 내용은 다루지 않겠습니다.

  • 더 이상 필요하지 않으면 myfifo다른 파일처럼 삭제할 수 있습니다( rm myfifo서버의 올바른 디렉터리에 있음).

  • 마침내중대한 경고.

    로컬 데이터는 script.py로컬 stdin을 통해 전송되며 ssh데이터는 원격 실행의 stdin에서 검색할 수 없는 스트림으로 사용할 수 있습니다 python. 이것은 문제가 되지 않습니다. 원래 코드에서는 이미 그런 경우가 발생했으며 제가 아는 한 python이 문제는 처리할 수 있습니다.

    마찬가지로 로컬 데이터는 다른 로컬 데이터의 표준 입력을 통해 전송되며 해당 데이터는 arg1원격 실행이 읽을 수 ssh있는 검색할 수 없는 스트림 으로 사용 가능합니다.pythonmyfifo이는 Python 스크립트가 파일에서 순차적으로 읽고 파일을 검색할 수 없도록 하려는 경우에만 작동합니다.. 파이프에서 읽은 내용은 검색할 수 없으므로 스크립트가 파이프에서 읽는 내용도 검색할 수 없습니다. 스크립트가 검색을 시도하면 실패합니다. 스크립트가 쓰기를 시도하면 myfifo실패하거나 오작동하게 됩니다(스크립트는 arg이런 방식으로 로컬을 수정할 방법이 전혀 없습니다).스크립트가 다음을 사용하여 필요한 작업을 수행할 수 myfifo있는지 여부어느 것이 공개되지 않았습니까?

    Python 스크립트에서 파일을 검색할 수 있어야 하는 경우 로컬 복사본을 서버의 일반 파일로 제공해야 합니다 arg(이 작업을 원하지 않는다고 명시적으로 말했지만 여전히 간단한 복사본이 가장 중요합니다).똑바로솔루션) 또는 서버에 로컬로 설치하여 arg다음과 같이 표시되도록 합니다.일반 파일거기. 후자의 접근 방식은 어려운 작업입니다. 서버 관리자의 도움 없이는 다음 작업만 수행할 수 있습니다.퓨즈또는 sshfs(curlftpfs만약에FUSE가 완전히 활성화되었습니다). 그리고 로컬 컴퓨터를 선택한 프로토콜에 대한 서버로 전환해야 하며 다른 컴퓨터가 로컬 컴퓨터에 액세스할 수 있는지 확인해야 합니다. 자세한 내용은 다루지 않겠습니다.

관련 정보