«./» не работает в «gcloud compute ssh test --command» - PullRequest
1 голос
/ 23 мая 2019

У нас есть один главный скрипт в Google Cloud Ubuntu VM, который выполняет много других скриптов.

Я пытаюсь выполнить основной скрипт из Windows Google Cloud SDK с помощью команды:

gcloud compute ssh vm --command="./main.sh"

Новсе, что я получаю -

. / main.sh Файл или каталог не существует

Команды, которые успешно выполняются main.sh:

gcloud compute ssh vm --command="/main.sh" 
gcloud compute ssh vm --command="bash -h /main.sh"

но не работает для всех других сценариев с такой же ошибкой

. / script.sh Файл или каталог не существует

Проблема в том, что все сценарии содержат ./ и будет кошмаромчтобы поменять все написанные разработчиками.

Есть идеи?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Потому что в вашем $HOME.

нет main.sh.

Вы можете запустить

gcloud compute ssh vm --command="cd / && ./main.sh"
0 голосов
/ 23 мая 2019

Вы можете изменить те файлы, которые пакетируются скриптом или в командной строке, используя perl или sed, которые оба способны напрямую редактировать файл. Вот рабочий пример, который можно просто использовать в командной строке. Замените startdir на полный путь к источникам скрипта. Предполагается, что - ваши скрипты заканчиваются на ".sh", нуждается в настройке - что можно безопасно заменить это выражение во всем сценарии - что эта замена должна быть сделана только 1 раз в строке

find startdir -name "*.sh" -print | xargs sed -i -e "s/\.\/main\.sh/\/main\.sh/"

Элегантность заключается в том, что xargs передает команде sed максимально возможное количество найденных имен файлов, чтобы уменьшить количество выполнений sed до минимума и не превышать максимальную длину командной строки.

Вы могли бы даже больше разобраться в сценарии оболочки, чтобы вы могли добавлять различные замены, если удаленные сценарии имеют разные имена.

В качестве альтернативы вы можете попытаться изменить каталог HOME удаленного пользователя / машины, на котором выполняются эти сценарии, чтобы в конце путь был правильным для «./main.sh». Но это может иметь и другие последствия, я бы не стал этого рекомендовать.

Я не уверен, полностью ли я понимаю вашу проблему, возможно, вам нужно объединить мой «один вкладыш» с другим предложением сначала изменить каталог на «/», а затем запустить скрипт с «./» как «. " обычно не в ПУТИ. Затем вы должны изменить подстановку следующим образом:

find startdir -name "*.sh" -print | xargs sed -i -e "s=\./main\.sh=cd / \&\& \./main\.sh="
...