You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动