Как передать вложенную команду для работы в командной строке в ssh? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть скрипт, подобный следующему:

#!/bin/bash
SERVER=127.0.0.1
ssh root@$SERVER << EOF
   checkcommand(){
      echo "checking $1"
      command -v $1 || apt install $1
   }
   checkcommand git
EOF

Он не будет работать вообще. Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вам необходимо запретить оценку переменных в этом документе в локальной системе. Вы можете заставить его работать как строка в кавычках, поместив конечный токен в кавычки.

#!/bin/bash
SERVER=127.0.0.1
ssh root@$SERVER << 'EOF'
   checkcommand(){
      echo "checking $1"
      command -v $1 || apt install $1
   }
   checkcommand git
EOF

Это описано в разделе Руководства Bash по Здесь Документы :

Если какая-либо часть слова заключена в кавычки, разделитель является результатом удаления кавычки для word , а строки в здесь-документе не являютсярасширен. Если слово не заключено в кавычки, все строки документа здесь подвергаются расширению параметров, подстановке команд и арифметическому расширению, последовательность символов \newline игнорируется, и ‘\’ должен использоваться для цитированиясимволы ‘\’, ‘$’ и '`.

word относятся к токену после <<, а delimiter относитсяк соответствующему токену в конце документа.

0 голосов
/ 07 ноября 2019

Вы можете использовать следующим образом:

ssh root@server command -v git || apt install git
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...