我在 PowerShell 中使用 plink 和 pageant 通过 ssh 连接到 Linux 机器并在其上运行命令。在 PS 脚本中,我尝试向 plink 提供一个 unix 脚本文件,如下所示。
测试.ps1:
$remote_cmd_file = "test.sh"
pageant $priv_key
plink $usr@$dom -batch -m $remote_cmd_file
(变量 $usr、$dom 和 $priv_key 已正确定义但未在此给出。)
“test.sh”文件的全部内容为:
cd /
pwd
我得到输出:
plink : bash: cd: command not found
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (bash: cd: command not found:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
/my/remote/home/directory
显然第二行执行了,但第一行没有执行。
如果我改为用空白行启动“test.sh”,则会收到类似的消息,但两个命令都会执行。我得到输出:
plink : bash: : command not found
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (bash: : command not found:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
/
最后,当我用如下一行启动脚本时
#!/bin/bash
然后我得到
plink : bash: #!/bin/bash: No such file or directory
At C:\workspace\test.ps1:8 char:1
+ plink $usr@$dom -batch -m $remote_cmd_file
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (bash: #!/bin...le or directory:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
/
但脚本中其他任何地方以 # 开头的行都被正确地解释为注释并且不会产生任何输出。
这似乎是 plink 或 bash 的问题,但我找不到任何现有的问题。作为一种解决方法,我似乎可以通过将第一行留空来确保所有命令都能执行,但警告很烦人,我想知道是什么导致了这个怪癖。
如果有帮助的话,我最终的目标是让这个脚本通过 slurm 在远程机器上提交作业,转换一些文件,然后在同一个 PowerShell 脚本中处理本地机器上的这些文件,我可以从命令行调用它们上的各种 Windows 程序。
答案1
问题出在 shell 脚本文件本身,它以字节顺序标记开头,干扰了对第一行的解释。创建一个不以该字符开头的文件可以解决此问题。