2016-10-25 25 views
0

因此,我有一個Python腳本連接到客戶端服務器,然後獲取我需要的一些數據。python值在遠程服務器上的bash行

現在,它將以這種方式工作,從客戶端我的bash腳本需要像下面的輸入和它的工作方式。

client.exec_command('/apps./tempo.sh' 2016 10 01 02 03)) 

現在我嘗試從我的python腳本獲取用戶輸入,然後將其轉移到我的遠程調用bash腳本和多數民衆贊成在那裏我得到了我的問題。這是我在下面嘗試的。

下面是我試過的方法,我沒有運氣的工作。

import sys 
client.exec_command('/apps./tempo.sh', str(sys.argv)) 
+2

的據推測工作代碼的例子在語法上是無效的。 'exec_command()'採取什麼參數?你在使用'paramiko'嗎? – mhawke

+0

也許''/apps./tempo.sh'+''.join(sys.argv)'? –

回答

0

我相信你正在使用Paramiko - 你應該在你的問題中標記或包含該信息。

的基本問題,我想你遇到的是,你需要這樣的字符串內的參數,即

client.exec_command('/apps./tempo.sh %s' % str(sys.argv)) 

否則他們會應用於exec_command的其他參數。我認爲你原來的例子在它的工作方式上不太準確。

只是出於興趣,你看過「結構」(http://www.fabfile.org) - 這有很多非常方便的功能,如「運行」,它將在遠程服務器上運行命令(或許多遠程服務器!)並返回你的迴應。

它還爲你提供了很多保護,包括popen和paramiko的hsh ssh登錄等,所以它可以更安全,然後嘗試製作Web服務或其他東西。

你應該時刻保持警惕的注入攻擊 - 林不清楚你是如何注入你的變量,但是如果用戶要求的東西,如python runscript "; rm -rf /"你的腳本,將有非常不好的問題爲您這反而會更好在命令中有「選項」,這些選項被編程,極大地限制了用戶的輸入,或者至少對輸入變量進行了大量的保護。當然,如果這隻適合你(或受過訓練的人),那麼它會更容易一點。

+1

這可以幫助我進行格式化。順便說一句我只是用3個不同的變量,所以我就潔淨從像 「[,「」 STDIN,STDOUT,標準錯誤= client.exec_command('/ apps./tempo.sh%S%S%sys.argv中沒有特殊字符s'%(str(y),str(m),str(d))) –

0

假設您使用的是paramiko,則需要將該命令作爲字符串發送。看來,要通過傳遞到您的Python腳本爲遠程命令參數的命令行參數,那麼試試這個:

import sys 

command = '/apps./tempo.sh' 
args = ' '.join(sys.argv[1:]) # all args except the script's name! 
client.exec_command('{} {}'.format(command, args)) 

這將收集所有傳遞給Python腳本,除了命令行參數第一個參數是腳本的文件名,並建立一個空格分隔的字符串。這個參數字符串是它們與bash腳本命令連接並遠程執行的。

0

我建議使用paramiko作爲ssh連接。

import paramiko 
ssh_client = paramiko.SSHClient() 
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_client.connect(server, username=user,password=password) 
... 
ssh_client.close() 

,如果你要模擬一個終端,就好像用戶打字:

chan=ssh_client.invoke_shell() 
chan.send('PS1="python-ssh:"\n') 

def exec_command(cmd): 
    """Gets ssh command(s), execute them, and returns the output""" 
    prompt='python-ssh:' # the command line prompt in the ssh terminal 
    buff='' 
    chan.send(str(cmd)+'\n') 
    while not chan.recv_ready(): 
     time.sleep(1) 
    while not buff.endswith(prompt): 
     buff+=ssh_client.chan.recv(1024) 
    return buff[:len(prompt)] 

用法示例:exec_command('pwd') 而結果甚至會通過ssh退還給您