如何在C#中通过SSH.NET库运行设备端Shell脚本并传递参数?
关于SSH.NET运行远程Shell脚本及传参的解决方案
1. 完全可以用SSH.NET运行远程Shell脚本
你的现有代码已经实现了核心功能,不过可以优化写法,直接指定脚本绝对路径更可靠,同时建议捕获脚本输出方便调试:
using (var sshclient = new SshClient(ConnNfo)) { sshclient.Connect(); // 直接用绝对路径调用脚本,省去cd的额外步骤 using (var cmd = sshclient.CreateCommand("/data/scripts/funk1.sh")) { cmd.Execute(); Console.WriteLine("执行命令: " + cmd.CommandText); Console.WriteLine("退出状态码: {0}", cmd.ExitStatus); // 捕获脚本标准输出和错误输出,方便排查问题 Console.WriteLine("脚本输出: " + cmd.Result); Console.WriteLine("错误输出: " + cmd.Error); } sshclient.Disconnect(); }
2. 向脚本传入变量的三种常用方式
方式一:命令行参数直接传递
这是Shell脚本最标准的传参方式,脚本内用$1、$2依次接收参数:
// 示例:传递两个参数,注意特殊字符用双引号包裹 string param1 = "带有空格的参数"; string param2 = "/tmp/test/path"; using (var cmd = sshclient.CreateCommand($"/data/scripts/funk1.sh \"{param1}\" {param2}")) { cmd.Execute(); // 后续处理逻辑 }
对应funk1.sh的使用示例:
#!/bin/bash echo "第一个参数: $1" echo "第二个参数: $2"
方式二:设置环境变量
如果脚本依赖环境变量,可在执行脚本前导出变量:
string envVarValue = "prod_env"; // 先导出环境变量,再执行脚本 using (var cmd = sshclient.CreateCommand($"export RUN_ENV={envVarValue} && /data/scripts/funk1.sh")) { cmd.Execute(); }
脚本内直接调用环境变量:
#!/bin/bash echo "运行环境: $RUN_ENV"
方式三:标准输入传递(适合交互型脚本)
如果脚本需要交互式输入(比如用read命令获取内容),可以用ShellStream替代CreateCommand实现交互:
using (var sshclient = new SshClient(ConnNfo)) { sshclient.Connect(); // 创建Shell流模拟终端交互 using (var shellStream = sshclient.CreateShellStream("xterm", 80, 24, 800, 600, 1024)) { // 发送执行脚本的命令 shellStream.WriteLine("/data/scripts/funk1.sh"); // 简单等待脚本请求输入(实际可监听输出判断时机) Thread.Sleep(500); // 发送需要输入的变量值 shellStream.WriteLine("交互式输入内容"); // 读取脚本输出 string output = shellStream.Read(); Console.WriteLine(output); } sshclient.Disconnect(); }
注意事项
- 传递含空格、引号的参数时,必须用双引号包裹,避免Shell解析出错。
- 确保远程脚本有可执行权限,可提前执行
chmod +x /data/scripts/funk1.sh设置。 - 优先使用命令行参数或环境变量传递变量,交互式方式仅用于必须手动输入的场景。
内容的提问来源于stack exchange,提问作者3izmanique
相关产品推荐
相关产品推荐

