Bash скрипт для открытия обратного туннеля SSH при запуске
Я пытаюсь запустить скрипт при запуске на компьютере Debian Jessie, помимо прочего он создает обратный туннель SSH.
Дело в том, что я поставил этот скрипт на if-up
и либо в rc.local
запустить из. Все остальные задания работают нормально, но когда ему нужно создать туннель SSH, он либо не может его создать, либо зависает при загрузке сообщения о выполнении задания.
Я был бы более ясен, но дело в том, что если я бегу /etc/rc.local
после загрузки машины туннель работает идеально.
Я должен добавить, что машина, для которой создан туннель, - это Raspberry Pi, и иногда я не могу выполнить ssh, пока не произвожу эхо-запросы. Я управлял сценарием, чтобы сделать это, но безуспешно при загрузке.
Как видите, я совсем не опытный, просто учусь.
редактировать: спасибо. Как я уже говорил, код работает отлично, если я запускаю его с консоли. Я даю ему полные разрешения (777) всем, на всякий случай и для тестирования. В сценарии разрешено выполнение, но только chmod +x, может быть, нужно что-то еще... вот код. Как я уже сказал, скрипт на удаленной машине запрашивает частные и публичные ip и помещает их в базу данных rpi, после чего он запускает обратное туннелирование (или нет). Запустите его из /etc/rc.local и скрипт сохранится в /usr. / местные / игры
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
publica=$(curl http://ipecho.net/plain)
sleep 0.25s
privada1= while IFS=$': \t' read -a line ;do
[ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
[ "${ip#127.0.0.1}" ] && privada1=$ip
done< <(LANG=C /sbin/ifconfig)
fecha=$(date +%F_%X)
sleep 0.15
nombre=$(hostname)
sleep 0.15s
curl --data "nombre=$nombre&fecha=$fecha&publica=$publica&privada1=$privada1&privada2=$privada2&privada3=$privada3&privada4=$privada4&press=envia" http://www.xxxxxxxxx.xx/xxx.php
while [[ $(autossh -p xxxx -R 10101:localhost:22 xx@xxxxxxxxx.xx -fN) -ne 0 ]]; do
ping -c3 xxxxxxxxx.xx
if ($? -eq 0) then
autossh -p xxxx -R 10101:localhost:22 xx@xxxxxxxxx.xx -fN;
else
ping -c3 xxxxxx.xxx
fi
done
else bash -x /etc/rc.local
fi
exit 0
2 ответа
Попробуйте этот скрипт:
#!/bin/bash
remote_host=rpi.local
remote_port=10022
local_port=22
cmd="ssh -fN -R ${remote_port}:localhost:${local_port} ${remote_host}"
while true; do
pgrep -fx "$cmd" >/dev/null 2>&1 || $cmd
sleep 10
done
Заметки:
Настройте удаленный хост и порты по мере необходимости.
Скрипт создает полный
ssh
командная строка вcmd
,Сценарий многократно (каждые 10 секунд) проверяет, существует ли процесс, выполняющий эту точную командную строку, и, если нет, запускает ее.
ssh
будет работать в фоновом режиме из-за-f
,Вызвать скрипт из
/etc/rc.local
,Чтобы убить туннель, сначала убейте скрипт, затем
ssh
процесс.Излишне говорить, что вам нужны ключи без паролей, чтобы это работало.
Хорошо, так для тех, кто застрял в этой точке или что-то. Благодаря другу, он дал мне подсказку. rc.local запускает скрипты как root. поэтому команда для запуска туннеля ssh, в моем случае autossh, должна запускаться от имени другого пользователя.
Создание sudo -u "youruser" сделает всю работу.
Спасибо всем.