Цикл для запуска bash с использованием ssh

Вероятно, это неудовлетворительный ответ, но я так не думаю. Недавно я попытался удалить gnome из Fedora 29, чтобы перейти на i3. После настройки оконного менеджера я использовал $ sudo dnf group remove gnome-desktop, чтобы «просто» избавиться от gnome, и после этого я даже не смог запустить xserver. Как вы сказали, $ dnf group remove gnome-desktop-environmentкажется устаревшим. Мне эта ветка тоже показалась интересной .

2
30.01.2021, 01:04
6 ответов

Правильный способ сделать это — либо настроить Pi на статический IP-адрес, чтобы он не менялся при перезагрузке, либо настроить локальный DNS-сервер для разрешения имени хоста. Настройка статического IP, безусловно, самая простая. Вы можете найти десятки руководств, если просто введете «raspbian static IP». Вот один:https://thepihut.com/blogs/raspberry-pi-tutorials/how-to-give-your-raspberry-pi-a-static-ip-address-update

Ваш скрипт не работает по множеству причин. Во-первых, это никогда не сработает:

call=`ssh user@192.168.0.$i`

Если машина не пускает вас или недоступна, то она напечатает ошибку, но эта ошибка будет напечатана в виде стандартной ошибки, а не стандартного вывода, поэтому $callбудет пустым. Если это сработает, и вы подключитесь к машине по ssh, вы войдете в систему, и снова $callбудет пустым, поскольку ничего не возвращается.

В любом случае ваш ifявляется синтаксической ошибкой. Это:

if [['$call'==*'user'*]]; then

должно быть так:

if [[ "$call" == *user* ]]; then

Вам нужны пробелы после и перед [[и ]], и если вы поместите переменную в одинарные кавычки ('$call'), тогда переменная не будет расширена:

$ echo '$call'
$call

Скорее всего, вы захотите войти в систему, запустить команду и, если она сработает, сохранить ip. Примерно так:

#!/bin/bash
for i in {1..100}
  do
    ## try to run a command and, if it works, we know the ip.
    ## you can use the command 'true' for this
    if ssh user@192.168.0.1.$i true; then
      echo "The IP is 192.168.0.1.$i"
      break
    fi
done

Это, однако, очень, очень неэффективно и медленно. Не делай этого. Просто настройте статический IP. Некоторые другие варианты, которые могут помочь::

  1. Получить список активных IP-адресов в сети

     nmap -sP 192.168.0.*
    
  2. Используйте pingвместо ssh, чтобы увидеть, какая машина включена:

     for i in {1..100}
     do
         if ping -c1 192.168.0.$i 2>/dev/null; then
           echo "The first IP that is UP is 192.168.0.1.$i"
           break
         fi
     done
    

Но на самом деле, если вам нужна помощь в настройке статического IP-адреса, задайте об этом новый вопрос. Это просто не лучшее решение вашей проблемы.

7
18.03.2021, 22:33

Настройте веб-сервер на Pi, который возвращает «Это Pi of iam _agf». Или даже динамическая страница, которая возвращает IP, что-то вроде «192.168.0.15 iam _agf». Это делается для того, чтобы убедиться, что это именно ваше устройство, а не принтер или кофеварка.

Вы можете использовать nmap, чтобы увидеть, на каких IP-адресах работает веб-сервер, а затем проверить их, чтобы увидеть, содержат ли они ваше ключевое слово и IP-адрес.

Получив IP-адрес, поместите его в файл /etc/hosts, чтобы вы могли легко получить доступ к пи по имени.

Простая проверка, работает ли он без nmap, может занять некоторое время:

for i in $(seq 1 254); do
    curl "http://192.168.0.${i}" | grep iam_igf
done

Есть плагин для nmap под названием ssh -brute,вы можете попробовать это с одной фиксированной комбинацией имени пользователя и пароля.https://nmap.org/nsedoc/scripts/ssh-brute.html

Также то, что вы, вероятно, искали изначально:

#this will open an ssh connection and wait for you to type stuff:
ssh user@IP

#this will run a command after the connection is open, then close it
ssh user@IP command

# example
ssh user@IP echo ok

# or just use the true command to avoid output
ssh user@IP true

# so this loop might do what you need, (untested, make backups of /etc/hosts first!)
for i in $(seq 1 254); do
    if ssh "user@192.168.0.${i}" true;
    then
        sed -i "/[0-9.]* mypi/d" /etc/hosts
        echo "192.168.0.${i} mypi" >> /etc/hosts
        break
    fi
done

Май

2
18.03.2021, 22:33

Для быстрого подключения используйте masscanдля сканирования активного хоста с sshпортом:

sudo masscan 192.168.0.1/24 --ports 22 --rate 100000 > alive
awk '{print $6}' alive > file
while read -r line; do  ssh user@"$line"; done < file

Еще лучше, один -вкладыш, как предлагают @terdon:

ssh user@$(sudo masscan 192.168.0.1/24 --ports 22 --rate 100000 | awk '{print $6}')

masscanвходит в состав некоторых дистрибутивов Linux.

масскан на гитхабе

3
18.03.2021, 22:33

ИспользуйтеmDNS(avahi )для обнаружения IP-адреса. На удаленке должен быть запущен как минимум сервер и настроен, на локальном должен быть как минимум клиент. Это своего рода распределенный (больше, чем обычный )локальный DNS. Вы также можете попробовать сообщить DHCP вашего маршрутизатора о выделении статического IP-адреса.

6
18.03.2021, 22:33

Не делай этого так, если можешь.

Кроме того, не рискуйте раздражать ИТ-отдел вашего учебного заведения, поэтому не возитесь со статическими IP-адресами.

У вас есть преимущество в том, что вы знаете MAC-адрес вашего Pi

Если ты

  1. ваша удаленная система может работать при включении Pi,
  2. в вашей удаленной системе может быть установлен tcpdump
  3. есть права на запуск tcpdump
  4. Pi и ваша удаленная система могут работать в одной сети

Вы знаете, что он пошлет пакет, который вы сможете увидеть. Ждать его.

$ sudu tcpdump -ni interface arp and ether src 00:02:00:02:aa:76

Где interface— сетевой интерфейс вашей удаленной системы, а 00:02:00:02:aa:76— MAC-адрес Pi

Это наименее навязчивый метод. -Он не делает ничего, что могло бы произойти в любом случае, поэтому вы не попадаете в поле зрения ИТ-специалистов.


Если вы
  1. в вашей удаленной системе может быть установлено сканирование arp -

  2. имеют права запускать arp -сканирование

  3. Pi и ваша удаленная система могут работать в одной сети

затем вы можете спросить все хосты в вашей сети, какие у них MAC-адреса, и найти Pi

$ sudu arp-scan -li interface -NT 00:02:00:02:aa:76

Опять же,где interface— сетевой интерфейс в вашей удаленной системе, а 00:02:00:02:aa:76— MAC-адрес Pi

Это довольно ненавязчиво, поэтому никто не должен его замечать, кроме самых педантичных сетевых администраторов. NB Я не пробовал, (у меня всегда есть доступ к tcdump)


Если это невозможно, при условии, что Pi позволяет вам использовать /etc/dhcp/dhclient-exit-hooks, чтобы отправлять вам по электронной почте конфигурацию сети каждый раз, когда она изменяется.

3
18.03.2021, 22:33

Одно и то же исправление заключается в том, чтобы запросить у администратора DHCP-сервера резервирование статического IP-адреса.

Pi будет использовать DHCP как обычно, но DHCP-сервер всегда будет давать ему один и тот же IP-адрес, который будет находиться внутри IP-сети, но, вероятно, вне диапазона выданных DHCP-адресов.

Утверждение и внедрение этого соглашения между вами и сетевыми администраторами -не имеет большого значения, но зависит от хороших рабочих отношений.

0
18.03.2021, 22:33

Теги

Похожие вопросы