2011-08-21 131 views
1

當我試圖遠程Linux機器上從Windows運行一個bash shell腳本抨擊。參數傳遞到執行腳本

我使用C#和SSH.Net庫。

腳本住在窗戶框,並不能在Linux機器上安裝。我在腳本中使用'File.ReadAllText(...)'讀取腳本作爲字符串加載。然後使用SSH.Net在Linux上執行腳本:

 SshCommand cmd; 
     using (var client = new SshClient(ConnectionInfo)) 
     { 
      client.Connect(); 
      cmd = client.CreateCommand(string.Format("sh -x -s < {0}", script));     
      cmd.Execute(); 
      client.Disconnect(); 
     } 
     return cmd.ExitStatus; 

這適用於腳本沒有任何參數的情況。但是,如果我需要在某些參數下執行腳本通過,但在PARAMS缺失:

 cmd = client.CreateCommand(string.Format("sh -x -s p={0} < {1}", parameterString, script)); 

示例腳本是:

#!/bin/bash 
# check-user-is-not-root.sh 

echo "Currently running $0 script" 
echo "This Parameter Count is  [$#]" 
echo "All Parameters   [[email protected]]" 

輸出是:

Currently running bash script 
This Parameter Count is  [0] 
All Parameters   [] 

更新

現在我使用銅(例如在批准的答案here :)。

cmd = client.CreateCommand(string.Format("curl http://10.10.11.11/{0} | bash -s {1}", scriptName, args)) 

但我仍然認爲必須有帶有參數的bash腳本讀取和跨SSH遠程Linux箱運行的方式。

任何幫助將不勝感激。

+0

你是否想象'<'後面的東西可以是一串命令?它應該是一個文件名。 – tripleee

+0

使用文件名很容易;-)你如何做到這一點,文件被讀入一個變量?.. – ozczecho

+0

請參閱下面的答案。基本上你要找的是'sh -c'。 – tripleee

回答

1

也許你是更好關閉運行ssh [email protected] 'command; another; more'或者如果你真的必須使用明確的sh,如ssh [email protected] "sh -c 'command; another; more'"。這也可以避免將腳本放在臨時文件中。

+0

腳本是預先烘焙的。他們可能會很長。我正在編寫的c#應用程序將使用ssh在遠程Linux機器上更改參數來運行這些腳本。我的應用程序將分析收到的結果。我能夠在沒有任何參數的情況下執行腳本,但是如果我傳入任何命令行參數 - 它們將被忽略。 – ozczecho

+0

奇怪的是,至少在OSX上,你必須結合'sh -c'和'-s'來獲取位置參數。 'sh -c'echo $ 1'-s bar'產生'bar',但沒有'-s'你什麼也得不到。 – tripleee

+0

儘管可能對命令長度有限制,但如果無法將腳本存儲在遠程盒子上,則這是要走的路。將腳本存儲在'/ tmp'中,然後執行它們並不是一種理智或安全的方式來處理這個策略。 – tripleee

0

我已經做了一些故障排除,完全關閉一臺Linux機器。我認爲 我認爲你的問題是'p ='。

我把你的測試腳本在/ tmp /腳本,運行以下:

$ ssh 192.168.2.3 sh -s foo bar baz < /tmp/script 
Currently running sh script 
This Parameter Count is  [3] 
All Parameters   [foo bar baz] 

我也試過

$ ssh 192.168.2.3 sh -s p=foo bar baz < /tmp/script 
Currently running sh script 
This Parameter Count is  [3] 
All Parameters   [p=foo bar baz] 

...所以我不完全知道爲什麼你」看到一個參數爲0,你應該至少看到'p ='作爲參數。它看起來像你試圖用'p ='來指定參數列表,但這不是必需的。嘗試一下沒有,然後看看會發生什麼。

要清楚,'/ tmp/script'存儲在我的本地 linux盒子中,而不是在遠程機器上。發送到SSH命令的標準輸入任何將被髮送到遠程機器並正在執行的命令的標準輸入處理,所以我可以很容易地使用命令

$ cat /tmp/script | ssh 192.168.2.3 sh -s foo bar baz 
+0

是的,這是有效的,但那是因爲腳本作爲Linux文件夾中的文件存在。在我的場景中,我將在Windows中存儲腳本並使用ssh在Linux上執行它們。我的代碼中的腳本變量引用了腳本內容,而不是腳本文件名。 – ozczecho

+0

... sorta。 sh的'-s'參數表示腳本應該來自stdin。 –

+0

這裏不能重複說明 – tripleee