키보드를 통해 for 루프 계속

키보드를 통해 for 루프 계속

Linux 시스템에 사용자 계정이 있지만 정확한 IP 주소를 모릅니다. 하지만 나는 그 중 하나에서 실행되는 범위를 알고 있습니다. 내가 원하는 서버가 어떤 서버인지 확인하고 싶어요. 일부 Microsoft 서버, 일부 Linux 서버 및 일부 서버도 다운되었습니다.

각 서버를 확인하는 쉘 스크립트가 있습니다.

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh 192.168.1.$i -l user_name
done

이 코드는 모든 IP에서 작동합니다. ssh를 실행하면 비밀번호를 묻는 메시지가 표시되고, ssh가 실행 중이 아니면 다음 IP를 시도하고, 서버가 다운되면 오랜 시간 동안 기다립니다. 또한 서버에 ssh가 있고 비밀번호를 묻는 메시지가 표시되면 해당 서버에서 키보드를 통해 벗어날 수 없습니다.

프로그램을 종료하지 않고 키보드를 통해 두 유형을 모두 탈출하고 다음 IP로 이동하려면 어떻게 해야 합니까?

예를 들어 CTRL+ C프로그램을 종료합니다.

답변1

Ctrl-C대화형 셸 포그라운드 작업의 모든 프로세스에 SIGINT 신호를 보냅니다. 그러면 sh실행 중인 스크립트와 ssh.

다음을 추가하여 쉘을 종료하지 않도록 만들 수 있습니다.

trap : INT

스크립트의 시작 부분에.

ConnectTimeout 옵션을 사용할 수도 있습니다 ssh.

ssh -o ConnectTimeout=2 ...

연결하려는 모든 컴퓨터에 비밀번호가 공개된다는 점에 유의하세요. 관리자를 신뢰하지 않는다면 이는 좋은 생각이 아닙니다.

답변2

긴 시간 초과 문제를 해결하려면 ping횟수가 적고 간격이 짧은(일반 사용자의 경우 최소 0.2초) 머신을 사용할 수 있는지 테스트할 수 있습니다.

...
ping -c 2 -i 0.2 "192.168.1.$i"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name
fi
...

개인/공개 키만 사용하여 서버에 로그인하려는 경우 ssh해당 인증을 수락하면 비밀번호를 묻는 메시지가 표시되면 ssh가 실패합니다.

답변3

ping -c 2 -i 0.2 "192.168.1.$i:"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name &
fi

이 섹션에서는 모든 SSH 연결이 백그라운드에서 실행되므로 비밀번호를 기다리지 않고 진행하는 데 도움이 됩니다.

컴퓨터의 비밀번호를 입력하고 싶을 때마다 실행하여 입력할 수 있으며 jobs, 그러면 백그라운드에서 실행 중인 모든 프로세스가 나열됩니다. 그런 다음 명령을 통해 필요한 SSH 연결을 포그라운드로 가져옵니다.fg %<job_id>

이 솔루션은 약간 까다롭거나 지저분할 수도 있지만 확실히 효과가 있습니다.

답변4

ssh_config를 사용해 볼 수 있습니다(실제로 이것은 키보드에서 찾고 있는 정확한 솔루션이 아닙니다). 서버에 대한 정보를 배우는 데 도움이 되는 두 가지 옵션이 있습니다.

ssh_config: 시스템 전체 구성은 /etc/ssh/ssh_config(Debian 및 일부 Linux 배포판)에 있습니다. - 사용자별 구성(예: ~/.ssh/config)을 작성할 수 있습니다.

  • BatchMode= 예로 설정하면 비밀번호 쿼리가 비활성화됩니다. 이 옵션은 스크립트에서 비밀번호를 입력하는 것을 방지하는 데 도움이 됩니다.

  • ConnectTimeout= SSH 서버에 연결을 시도할 때 사용되는 시간(초)입니다. 이는 tcp 시간 초과 값 대신 명령줄 옵션에 지정된 명시적 시간을 사용합니다.

  • ConnectionAttempts= 패킷이 삭제된 것으로 의심되는 경우.

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh -o BatchMode=yes -ConnectTimeout=20 192.168.1.$i -l user_name
done

관련 정보