PowerShell调用MobaXterm执行SSH连接时卡住并报错/bin/bash: -c: option requires an argument
PowerShell调用MobaXterm执行SSH连接时卡住并报错/bin/bash: -c: option requires an argument
看起来你遇到了两个核心问题才导致这个错误,咱们一步步拆解解决:
1. 最关键的错误:本地脚本路径不能直接在远程用
你把脚本写到了本地Windows的C:/temp/commands.sh,但MobaXterm的-cmd参数是让远程服务器执行命令啊!远程的Unix系统根本没有C:盘这个路径,这就导致远程bash找不到要执行的脚本,直接触发了后续的参数错误。
解决思路:不需要在本地创建脚本文件,直接把要执行的命令传递给远程服务器就行,或者如果必须用脚本,得先把本地脚本上传到远程(比如用SCP),但简单场景下直接传命令更省事。
2. 命令参数的引号包裹问题
你给-cmd的参数里包含&&和空格,PowerShell传递给MobaXterm的时候没有正确包裹,导致命令被拆分成了多个片段,bash的-c选项就拿到了不完整的参数,于是报错-c: option requires an argument。
修正后的完整脚本
这里提供两种可靠的写法,你可以选一种:
写法一:直接传递单行命令(适合短命令)
# SSH connection parameters $sshHost = "MyIP" $sshUsername = "MyUsername" $sshPassword = "MyPassword" # 把要执行的命令整合成单行,用&&连接 $remoteCommands = "echo Hello, this is a test && ls -l" # Path to MobaXterm executable $MobaXtermPath = "C:\Program Files (x86)\Mobatek\MobaXterm\MobaXterm.exe" # 关键:把远程命令用双引号包裹,用反引号`转义,确保PowerShell把它作为一个完整参数传递 Start-Process -FilePath $MobaXtermPath -ArgumentList "-newtab", "-ssh", "$sshUsername@$sshHost", "-cmd", "bash -c `"$remoteCommands`""
写法二:传递多行命令(适合复杂场景)
如果你的命令很多行,不想手动用&&拼接,可以用这种方式:
# SSH connection parameters $sshHost = "MyIP" $sshUsername = "MyUsername" $sshPassword = "MyPassword" # 定义多行远程命令 $remoteCommands = @" echo Hello, this is a test ls -l # 可以在这里加更多命令 "@ # 把多行命令转换成适合bash执行的格式,用printf传递 $cmdToExecute = "printf '%s' '$remoteCommands' | bash" # Path to MobaXterm executable $MobaXtermPath = "C:\Program Files (x86)\Mobatek\MobaXterm\MobaXterm.exe" # 同样要正确包裹参数 Start-Process -FilePath $MobaXtermPath -ArgumentList "-newtab", "-ssh", "$sshUsername@$sshHost", "-cmd", "`"$cmdToExecute`""
额外注意事项
- 如果你后续需要执行复杂的脚本,记得先把本地脚本上传到远程服务器(比如用MobaXterm的
-scp参数),再用-cmd执行远程服务器上的脚本路径(比如/tmp/commands.sh) - PowerShell里传递带特殊字符的参数时,一定要注意引号的转义,反引号`是PowerShell的转义符,用来让内部的双引号被当作普通字符传递给外部程序
备注:内容来源于stack exchange,提问作者sw29




