SSH를 사용하여 루프에서 bash 실행

SSH를 사용하여 루프에서 bash 실행

홈 네트워크에 Raspberry Pi가 연결되어 있는데 재부팅할 때마다 IP 주소가 변경됩니다. 매번 ssh user@ipaddress를 호출하는 대신 bash 스크립트를 실행하여 어떤 주소가 유효한지 알고 싶습니다.

ssh user@ipaddressIP 주소의 마지막 숫자를 변경하기 위해 여러 번 실행해 보았습니다 . Bash가 어떻게 작동하는지 모르기 때문에 .sh다음과 같이 파일을 만들어 보았습니다.

for i in {1..100}
do
  call=`ssh [email protected].$i`
  if [['$call'==*'user'*]]; then
    echo "$i"
  else
    :
  fi
done

내 질문은 다음과 같습니다

  • 나는 아무것도 인쇄하지 않습니다
  • 첫 번째 호출에서 멈춰서 반복되지 않습니다.

그래서 다른 장치일 때 명령을 전달하는 bash 기능이 있는지 궁금합니다. 내 사용자 이름을 알고 있으므로 명령 출력의 첫 번째 줄에서 내 사용자 이름을 찾으면 됩니다. '더 이상 기다릴 필요가 없습니다. 출력.

답변1

이를 수행하는 올바른 방법은 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 [email protected].$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 [email protected].$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를 설정하는 데 도움이 필요하면 해당 문제에 대한 새로운 질문을 게시하세요. 이것은 귀하의 문제에 대한 좋은 해결책이 아닙니다.

답변2

(avahi)를 사용하여 mDNS IP 주소를 검색하세요. 원격은 최소한 서버를 실행하고 구성해야 하며, 로컬은 최소한 클라이언트여야 합니다. 이는 분산된(일반이 아닌) 로컬 DNS입니다. 라우터의 DHCP가 고정 IP 주소를 할당하도록 할 수도 있습니다.

답변3

빠른 연결을 위해 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

더 나은 방법은 제안된 라인을 따르는 것입니다.@테덴:

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

masscan일부 Linux 배포판에 패키지되어 있습니다.

github의 Masscan

답변4

"This is the Pi of iam_agf"를 반환하는 Pi에 웹 서버를 설정합니다. 또는 "192.168.0.15 iam_agf"와 같이 IP를 반환하는 동적 페이지일 수도 있습니다. 이는 이 장치가 프린터나 커피 머신이 아닌 귀하의 장치인지 확인하기 위한 것입니다.

nmap을 사용하여 웹 서버를 실행하는 IP를 확인한 다음 해당 IP에 키워드와 IP가 포함되어 있는지 확인할 수 있습니다.

IP를 확보한 후에는 이를 /etc/hosts 파일에 넣어 이름으로 쉽게 pi에 액세스할 수 있습니다.

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 "[email protected].${i}" true;
    then
        sed -i "/[0-9.]* mypi/d" /etc/hosts
        echo "192.168.0.${i} mypi" >> /etc/hosts
        break
    fi
done

가능한

관련 정보