хорошо, я видел другие вопросы, и я не думаю, что мой вопрос применим, так что я иду ... Я программист, только новичок в сценариях 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
не заканчивается (по замыслу). Нужна помощь!
blah.sh
действительно находится в родительском каталоге вашего домашнего каталога? Обычно это должен быть каталог только для чтения, в который вы не можете помещать файлы.
прежде всего спасибо за ваш ответ ....... и я понимаю
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 файла в порожденных в отдельных терминалах вместе с каталогом изменений команда и завершается выполнением скрипта (какое расширение вы рекомендуете, кстати?)
Общая цель - автоматизировать инициацию ssh-соединения вместе с командой cd для доступа к сценарию, который я хочу запустить. ssh cmd в текстовом файле работает, если применяется в среде bash, поэтому меня смущают модификации .... Я просто неправильно думаю об этой проблеме с логической точки зрения?
Вы смешиваете код и данные, данные - это имя хоста и PEM, а команда - ssh
. Цитаты (если они действительно есть, как показано в вашем примере) определенно являются проблемой.
Сценарии обычно не должны иметь расширения в своем имени файла. Нередко возникает желание переопределить сценарий на другом языке, и тогда расширение оказывается неправильным.
первая строка кода находится В текстовом файле, это то, что я говорю .... я просто хочу добавить последние две строки в цикл while, и моя новая проблема заключается в том, что у меня возникают проблемы с запуском введенной строки данные как код. `#! / bin / bash при чтении x do x wait [x] cd / st / task / ./start done <pdns.txt`
Ваш wait
возобновит работу только после выхода команды ssh
. См. stackoverflow.com/questions/37586811/…
Вы можете изменить текстовый файл, но опять же, это безумие. Отделите код от данных, поместите весь код в сам скрипт. while read -r junk ignore pem host; do ssh -i "$pem" "${host%\"}" 'cd /st/task && ./start' </dev/null; done <pdns.txt
то, что я не говорю четко, так это то, что текстовый файл имеет код 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
, что вы думаете?
Как я уже сказал, изменение кода в текстовом файле из вашего сценария и последующее выполнение текстового файла технически возможно, но ненадежно и подвержено ошибкам и проблемам с безопасностью. Помещение кода в комментарии на самом деле не работает; не могли бы вы отредактировать свой вопрос, чтобы опубликовать узел, а также объяснение того, что, по вашему мнению, будет, если оно будет правильным?
Если вы надеетесь, что код запустит в в окне konsole
, это снова тот же вопрос. Я сейчас отмечаю это как дубликат.
подождите ... я уже выполнил эту задачу ... мой вопрос отмечен в приведенном выше коде
Тогда действительно непонятно, чего вы надеетесь достичь, а какая часть не работает. Код, который делает не то, что вы хотите, - не очень хороший индикатор того, что вы действительно хотите. Но, возможно, обдумайте это еще немного и, возможно, в конечном итоге опубликуйте новый вопрос с более четко определенным вопросом. См. Также руководство по созданию минимальный воспроизводимый пример.
Код, который запускает $0
, в частности, кажется не связанным с вашей заявленной целью, но почти наверняка не делает то, что вы хотите.
Какой у Вас вопрос? Удаление кавычек в начале и в конце строки - единственная нетривиальная часть. Вам не нужно знать, сколько там строк, просто читайте по одной, пока ничего не получите.
while read -r line; do : something with "$line"; done <input.txt