Bash скрипт для ssh на сервер, затем выполните команды

хорошо, я видел другие вопросы, и я не думаю, что мой вопрос применим, так что я иду ... Я программист, только новичок в сценариях bash Я хочу использовать ssh в своем экземпляре Amazon, а затем запустить свой собственный файл .sh псевдо:

{
ssh -i ...
cd /../
./blah.sh
profit!
}

У меня есть несколько (5+) экземпляров, сохраненных в текстовом файле, который я хотел бы зациклить, поэтому в конечном итоге каждый экземпляр будет иметь свой собственный диалог ssh .... текстовый файл содержит всю команду

"ssh -i blah.pem [email protected]"

ОБНОВИТЬ:

#!/bin/bash
while read LINE
    do
[ ! -f /tmp/$(basename $0) ] && cp $0 /tmp/ && konsole -e $0 && exit
rm /tmp/$(basename $0) # open separate window for code to run
    $LINE << EOF# read line (ssh cmd)
    cd /st/task/ #commands during ssh
    ./start.sh #need something to let this run and go back to beginning of loop 
EOF
done < pdns.txt

С вашей помощью я дошел до этого, и это работает ... Итак, моя новая проблема в том, что после выполнения первой операции ssh она не переходит к следующей операции ssh, потому что файл start.sh не заканчивается (по замыслу). Нужна помощь!

Какой у Вас вопрос? Удаление кавычек в начале и в конце строки - единственная нетривиальная часть. Вам не нужно знать, сколько там строк, просто читайте по одной, пока ничего не получите. while read -r line; do : something with "$line"; done <input.txt

tripleee 17.12.2018 17:17

blah.sh действительно находится в родительском каталоге вашего домашнего каталога? Обычно это должен быть каталог только для чтения, в который вы не можете помещать файлы.

tripleee 17.12.2018 17:19

прежде всего спасибо за ваш ответ ....... и я понимаю

Hn Nm 17.12.2018 18:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 085
1

Ответы 1

I предполагать вы, наверное, ищете что-то вроде

while read -r ignore stuff pem host; do
    ssh -i "$pem" "${host%\"}" 'cd .. && ./blah.sh' </dev/null
done <input.txt

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

while read -r host pem; do
    ssh -i "$pem" "$host" 'cd .. && ./blah.sh' </dev/null
done <<\____HERE
    server1.example.com  server1.pem
    server2.example.net  second.pem
    third.example.org    number3.pem
____HERE

Одним из распространенных источников ошибок является то, что ssh поглощает ввод, предназначенный для чтения while read -r; перенаправление </dev/null предотвращает это.

Кстати, многие сценарии не нужно запускать в каталоге, в котором они хранятся. Возможно, просто ../blah.sh тоже подойдет. Кроме того, косвенно, файл сценария, вероятно, не должен иметь расширения .sh.

Хорошо, еще раз спасибо, я поражен твоими знаниями ..... (вау, это потрясающее место) хорошо, мне нужно поговорить об этом, потому что я не совсем понимаю ваш код, и я здесь, чтобы научиться не просто копировать чужую работу. ...... поэтому моя цель состоит в том, чтобы сценарий запускал ssh -i blah.pem [email protected] (который мне нужно изменять для каждой итерации), полученный из txt файла в порожденных в отдельных терминалах вместе с каталогом изменений команда и завершается выполнением скрипта (какое расширение вы рекомендуете, кстати?)

Hn Nm 17.12.2018 21:16

Общая цель - автоматизировать инициацию ssh-соединения вместе с командой cd для доступа к сценарию, который я хочу запустить. ssh cmd в текстовом файле работает, если применяется в среде bash, поэтому меня смущают модификации .... Я просто неправильно думаю об этой проблеме с логической точки зрения?

Hn Nm 17.12.2018 21:37

Вы смешиваете код и данные, данные - это имя хоста и PEM, а команда - ssh. Цитаты (если они действительно есть, как показано в вашем примере) определенно являются проблемой.

tripleee 18.12.2018 06:45

Сценарии обычно не должны иметь расширения в своем имени файла. Нередко возникает желание переопределить сценарий на другом языке, и тогда расширение оказывается неправильным.

tripleee 18.12.2018 06:46

первая строка кода находится В текстовом файле, это то, что я говорю .... я просто хочу добавить последние две строки в цикл while, и моя новая проблема заключается в том, что у меня возникают проблемы с запуском введенной строки данные как код. `#! / bin / bash при чтении x do x wait [x] cd / st / task / ./start done <pdns.txt`

Hn Nm 18.12.2018 17:16

Ваш wait возобновит работу только после выхода команды ssh. См. stackoverflow.com/questions/37586811/…

tripleee 18.12.2018 17:18

Вы можете изменить текстовый файл, но опять же, это безумие. Отделите код от данных, поместите весь код в сам скрипт. while read -r junk ignore pem host; do ssh -i "$pem" "${host%\"}" 'cd /st/task && ./start' </dev/null; done <pdns.txt

tripleee 18.12.2018 18:35

то, что я не говорю четко, так это то, что текстовый файл имеет код ssh полностью ... так что ssh -i user @ server #!/bin/bash while read LINE do [ ! -f /tmp/$(basename $0) ] && cp $0 /tmp/ && konsole -e $0 && exit rm /tmp/$(basename $0) $LINE + " bash -s" << 'ENDSSH' cd /st/task/ ./start ENDSSH done < pdns.txt, что вы думаете?

Hn Nm 18.12.2018 18:49

Как я уже сказал, изменение кода в текстовом файле из вашего сценария и последующее выполнение текстового файла технически возможно, но ненадежно и подвержено ошибкам и проблемам с безопасностью. Помещение кода в комментарии на самом деле не работает; не могли бы вы отредактировать свой вопрос, чтобы опубликовать узел, а также объяснение того, что, по вашему мнению, будет, если оно будет правильным?

tripleee 18.12.2018 18:55

Если вы надеетесь, что код запустит в в окне konsole, это снова тот же вопрос. Я сейчас отмечаю это как дубликат.

tripleee 19.12.2018 12:52

подождите ... я уже выполнил эту задачу ... мой вопрос отмечен в приведенном выше коде

Hn Nm 19.12.2018 14:13

Тогда действительно непонятно, чего вы надеетесь достичь, а какая часть не работает. Код, который делает не то, что вы хотите, - не очень хороший индикатор того, что вы действительно хотите. Но, возможно, обдумайте это еще немного и, возможно, в конечном итоге опубликуйте новый вопрос с более четко определенным вопросом. См. Также руководство по созданию минимальный воспроизводимый пример.

tripleee 19.12.2018 14:18

Код, который запускает $0, в частности, кажется не связанным с вашей заявленной целью, но почти наверняка не делает то, что вы хотите.

tripleee 19.12.2018 14:19

Другие вопросы по теме