2013-05-09 102 views
0

我的服務器運行Windows 7 with freeSSHd以允許ssh連接。我試圖使用paramiko遠程執行該服務器上的程序MyProgram.exe。這是執行其工作的代碼的相關部分。不過,它需要改進。如何防止paramiko打開新的cmd窗口

import paramiko 
import time 

cmds = 'xcopy file1 backup\\file1 & xcopy file2 backup\\file2 & MyProgram.exe file1 file2' 
final_cmds = 'cmd.exe /c "' + final_cmds + '"' 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  
ipaddr = socket.gethostbyname(hostname) 
ssh.connect(ipaddr, port=port, username=username, password=password)  
transport = ssh.get_transport() 
channel = transport.open_session() 
channel.setblocking(1) 
channel.settimeout(None) 
channel.set_combine_stderr(1) 
channel.exec_command(final_cmds) 

while True: 
    try: 
     if channel.exit_status_ready(): 
      if channel.recv_ready(): 
       output = channel.recv(1024) 
       break 
    except: 
     print 'Exception' 
     break  
    time.sleep(2) 

ssh.close() 

上述代碼的問題在於它會在服務器端打開一個新的cmd窗口。我想在後臺運行cmd.exe的或至少是最小化,但如果我更改線路

final_cmds = 'cmd.exe /c "' + final_cmds + '"' 

final_cmds = 'start /b cmd.exe /c "' + final_cmds + '"' 

final_cmds = 'start /min cmd.exe /c "' + final_cmds + '"' 

甚至

final_cmds = 'start cmd.exe /c "' + final_cmds + '"' 

我收到一個錯誤:「無法執行命令或遠程系統上的shell:執行進程失敗。「有任何想法嗎?

感謝

回答

0

start /min不工作的paramiko因爲沒有啓動cmd.exe的,當你調用execute_command。

它類似於當您從「運行」窗口(Windows鍵+ R)命令

因此,許多命令將不會作爲start,類型和回聲等工作你會得到什麼。

最簡單的方法是編寫或傳輸腳本並將其在目標中運行。

final_cmds = 'cmd.exe /c echo ' + final_cmds + '> runme.bat & runme.bat' 
[...] 
channel.exec_command(final_cmds) 

,你可以之前的任何你的命令的使用start /min這種方式來運行它「隱藏」。

此外,如果你需要附和他們到腳本之前轉義一些字符,如>&final_cmds.replace('>','^>')

+0

另外,您可以用不同的用戶所登錄,在一個運行sshd服務。 這樣它就不會打開任何窗口。 Linux中的一種常見做法是爲每個服務提供一個用戶,如果您可以自由創建用戶,則具有通過SSH連接更輕鬆地審覈活動的額外優勢。 – Txangel 2013-05-10 08:49:56

+0

謝謝,這兩種方法確實工作得很好。我決定第二個,因爲在我的情況下它看起來更優雅。 – pegazik 2013-05-11 20:27:50