Я пытаюсь запустить скрипт при запуске на компьютере 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 ответа2

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 .

  • Излишне говорить, что вам нужны ключи без паролей, чтобы это работало.

0

Хорошо, так для тех, кто застрял в этой точке или что-то. Благодаря другу, он дал мне подсказку. rc.local запускает скрипты как root. поэтому команда для запуска туннеля ssh, в моем случае autossh, должна запускаться от имени другого пользователя.

Создание sudo -u "youruser" сделает всю работу.
Спасибо всем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .