Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Получение ssh для выполнения команды в фоновом режиме на целевой машине
Это следующий вопрос к тому, как вы используете ssh в скрипте shell? вопрос. Если я хочу выполнить команду на удаленной машине, которая выполняется в фоновом режиме на этой машине, как я могу получить команду ssh для возврата? Когда я пытаюсь просто включить амперсанд (&) в конце команды, он просто зависает. Точная форма команды выглядит так:
ssh user@target "cd /some/directory; program-to-execute &"
Есть какие-нибудь идеи? Одна вещь, чтобы отметить, что логины на целевой машине всегда производят текстовый баннер, и у меня есть SSH ключей, настроенных так, что пароль не требуется.
У меня была эта проблема в программе, которую я написал год назад-оказывается, ответ довольно сложный. Вам нужно будет использовать nohup, а также перенаправление вывода, Как описано в Википедии artcle на nohup, скопированном здесь для вашего удобства.
Nohuping справочная рабочих мест для пример полезен при входе в систему через SSH, так как фоновые задания могут вызвать shell зависнуть на выходе из системы из-за гонки условие [2]. Эта проблема также может быть преодолены путем перенаправления всех трех Потоки ввода-вывода:
nohup myprogram > foo.out 2> foo.err < /dev/null &
Перенаправление fd's
Вывод должен быть перенаправлен с помощью &>/dev/null , который перенаправляет как stderr, так и stdout на /dev/null и является синонимом >/dev/null 2>/dev/null или >/dev/null 2>&1 .
Парантезы
Лучше всего использовать sh -c '( ( command ) & )' там, где команда-это что угодно.
ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
Nohup и Shell
Вы также можете использовать nohup непосредственно для запуска shell:
ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
Хороший Старт
Еще одна хитрость заключается в использовании приятно запустить command/shell:
ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
Если вы don't/can't держите соединение открытым, вы можете использовать экран, если у вас есть права на его установку.
user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &
Чтобы отсоединить сеанс экрана: ctrl-a d
В списке сеансов экрана :
screen -ls
Для повторного подключения сеанса:
screen -d -r remote-command
Обратите внимание, что экран также может создавать несколько оболочек в рамках каждого сеанса. Аналогичного эффекта можно добиться и с tmux .
user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &
Чтобы отсоединить сеанс tmux: ctrl-b d
В списке сеансов экрана :
tmux list-sessions
Для повторного подключения сеанса:
tmux attach <session number>
Ключ управления tmux по умолчанию, ' ctrl-b ', несколько сложен в использовании, но есть несколько примеров конфигураций tmux, которые поставляются с tmux, которые вы можете попробовать.
Я думаю, что вам придется объединить несколько этих ответов, чтобы получить то, что вы хотите. Если вы используете nohup в сочетании с точкой с запятой и заключаете все это в кавычки, то вы получаете:
ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"
и это, кажется, работает на меня. С nohup вам не нужно добавлять & к команде, которую нужно выполнить. Кроме того, если вам не нужно читать какие-либо выходные данные команды, вы можете использовать
ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"
чтобы перенаправить все выходные данные на /dev/null.
На самом деле, когда мне нужно выполнить сложную команду на удаленной машине, я предпочитаю поместить ее в сценарий на целевой машине и просто запустить этот сценарий, используя ssh.
Например:
# simple_script.sh (located on remote server)
#!/bin/bash
cat /var/log/messages | grep <some value> | awk -F " " '{print $8}'
А потом я просто запускаю эту команду на исходном компьютере:
ssh user@ip "/path/to/simple_script.sh"
Я пытался сделать то же самое, но с добавленной сложностью, что я пытался сделать это с Java. Итак, на одной машине под управлением java я пытался запустить скрипт на другой машине, в фоновом режиме (с nohup).
Из командной строки, Вот что сработало: (вам может не понадобиться "-i keyFile", если вам не нужно это ssh для хоста)
ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""
Обратите внимание, что в моей командной строке есть один аргумент после "-c", который все заключен в кавычки. Но для того, чтобы он работал на другом конце, ему все еще нужны кавычки, поэтому мне пришлось поместить в него экранированные кавычки.
Из java, вот что сработало:
ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
"\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.
Потребовалось немного пробных ошибок &, чтобы заставить это работать, но теперь это, кажется, работает хорошо.
Мне показалось довольно удобным иметь удаленный сеанс tmux, используя синтаксис tmux new -d <shell cmd> , как это:
ssh someone@elsewhere 'tmux new -d sleep 600'
Это приведет к запуску новой сессии на узле elsewhere , а команда ssh на локальном компьютере почти мгновенно вернется к shell. Затем вы можете ssh к удаленному хосту и tmux attach к этому сеансу. Обратите внимание, что нет ничего о локальном запуске tmux, только удаленный!
Кроме того, если вы хотите, чтобы ваш сеанс сохранялся после выполнения задания, просто добавьте shell launcher после вашей команды, но не забудьте заключить его в кавычки:
ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'
Я думаю это то что тебе нужно:
Сначала вам нужно установить sshpass на вашем компьютере.
затем вы можете написать свой собственный сценарий:
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Сначала выполните эту процедуру:
Войти на как пользователь и генерировать пары ключей аутентификации. Не вводите парольную фразу:
a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa):
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A
Теперь используйте ssh для создания каталога ~/.ssh как пользователь b на B. (каталог может уже существовать, что нормально):
a@A:~> ssh b@B mkdir -p .ssh
b@B's password:
Наконец, добавьте новый открытый ключ a к b@B:.ssh/authorized_keys и введите пароль b в последний раз:
a@A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password:
С этого момента вы можете войти в B как b из A как a без пароля:
a@A:~> ssh b@B
тогда это будет работать без ввода пароля
ssh b@B "компакт-диск /some/directory; program-to-execute &"