
Я использую plink и pageant в PowerShell для подключения и выполнения команд на машине Linux через ssh. В скрипте PS я пытаюсь предоставить файл скрипта unix для plink следующим образом.
тест.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
Проблема была в самом файле скрипта оболочки, который начинался с Byte Order Mark, что мешало интерпретации его первой строки. Создание файла, который не начинался с этого символа, решило проблему.