我正在尝试在远程Linux机器上从Windows执行bash shell脚本。
我正在使用c#和SSH.Net库。
脚本存在于Windows机器上,无法安装在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;
当脚本没有任何参数时,此方法有效。但是,如果我需要传递一些参数,则以下执行脚本但缺少参数:
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 [$@]"
输出结果为:
Currently running bash script
This Parameter Count is [0]
All Parameters []
更新
现在我正在使用curl(就像批准的答案here :)。
cmd = client.CreateCommand(string.Format("curl http://10.10.11.11/{0} | bash -s {1}", scriptName, args))
但我仍然认为必须有一种方法可以在带有参数的bash脚本中读取并在远程Linux机器上的ssh中运行它。
非常感谢任何帮助。
答案 0 :(得分:1)
也许你最好不要运行ssh user@host 'command; another; more'
,或者你真的必须使用明确的sh
,例如ssh user@host "sh -c 'command; another; more'"
。这也应该可以避免您将脚本放在临时文件中。
答案 1 :(得分:0)
我做了一点故障,完全脱离了linux盒子。我认为 我认为你的问题是'p ='。
我将测试脚本放在/ tmp / script中,并运行以下命令:
$ 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