2017-12-20 8 views
0

원격 서버에 상주하는 스크립트를 실행하고 있습니다. 이 bash 스크립트는 변수를 사용합니다. 이 변수는 ~/.profile에 정의됩니다. 이를 위해 는subprocess를 사용하여 원격 스크립트 실행 - 원격 스크립트는 ~/.profile의 vars를 사용합니다.

$MYVAR=/a/b/c 

그래서 원격 원격 서버 또는 SSH에 내가

echo $MYVAR returns /a/b/c as you would expect. 

을 실행하지만 로컬 파이썬 하위 프로세스를 사용하여 원격 스크립트를 실행하는 경우, 스크립트가 실패라고 할 수 있습니다. 스크립트가 $ MYVAR을 사용하여 실패로 잘못 해석됩니다.

이것은 SSH를 통해 실행 중이기 때문에 ~./프로필이로드되어서는 안되며 대신 다른 프로필을 사용 중입니다. 여기

https://superuser.com/questions/207200/how-can-i-set-environment-variables-for-a-remote-rsync-process/207262#207262는 파이썬 스크립트에서 실행되는 명령입니다 여기에서 볼

ssh = subprocess.Popen(['ssh', '%s' % env.host, 'cd /script/dir | ./myscript arg1 arg2'],shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

내 질문은 내가 사용자가 ~/.profile에 다음 실행로드, 원격으로 ssh를 것, 로컬 스크립트를 실행 할 수있는 방법입니다 bash 스크립트.

+0

아래의 예에서 $ MYVAR' 코드에서 어떻게 사용되고 있는지'아무 생각을 같이하지 않기 때문에

http://www.paramiko.org/

설치가 완료되면, 당신은'./myscript'에서하는 명령을 실행할 수 있습니다 ? – georgexsh

+0

'cd 무언가 | somecommand'는'cd '가 표준 출력에 유용한 것을 생성하지 않기 때문에 아무런 도움이되지 않습니다. 실제로 * 성취하려는 것은 무엇입니까? – tripleee

+0

당신은'[ 'ssh', 'remote', 'cd dir; myvar = "{}"somecommand arg1 arg2'.format (shlex.quote (os.environ [ 'MYVAR']))'? – tripleee

답변

0

이 가장 쉬운 해결책은 tmp를하는 래퍼 스크립트를 scp를 위해 다음 파이썬 스크립트의 방법을 만들 그래서 지금 이렇게

#!/bin/bash 
. /users/me/.profile 

cd /dir/where/script/exists/ 

exec script LIVE "[email protected]" 

같은 래퍼 스크립트의 종류를 만드는 것이었다 디렉토리

scp wrapper [email protected]:/tmp 
질문에

SSH를 명령은

subprocess.Popen(['ssh', '%s' % env.host, env.installPatch],shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

env.installPatch 번역된다 s :

cd /tmp; ./wrapper 'patch_name' 

이제 .profile이로드되고 패치 스크립트에 올바른 변수 값이 있습니다. exec를 사용하면 모든 출력을 패치 o/p에서 다시 얻을 수 있으며 파일에 쓸 수 있습니다.

내 사례에서 가장 깨끗한 해결책이었습니다.

1

paramiko 모듈을 사용하여 로컬에서 원격 서버의 스크립트를 실행할 수 있습니다.

import paramiko 
command=" 'ssh', '%s' % env.host, 'cd /script/dir | ./myscript arg1 arg2' " 
ssh=paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('192.18.1.26',port=22,username='root',password='defassult') #This will connect to remote server 
stdin,stdout,stderr=ssh.exec_command(command) #This will execute the command on remote server 
output=stdout.readlines() 
print '\n'.join(output) 
+0

안녕하세요, 그렇습니다. 모듈을 사용할 수 있다는 사실을 알았지 만, 다른 사람들이이 스크립트를 사용하는 것을 가능한 한 간단하게 유지하려고합니다. 즉,이 목적을 위해서 표준 라이브러리 모듈 만 사용할 수 있습니다. – Nanotron