参数传递到执行脚本

问题描述:

当我试图远程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

也许你是更好关闭运行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

我已经做了一些故障排除,完全关闭一台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