저는 거의 200개의 서버에 대한 활성 계정이 필요한 새로운 계약을 시작했습니다. 보안을 통해 30일 동안 활동이 없으면 계정이 잠기고 계정 잠금이 해제된 후 1시간 이내에 로그인하지 않으면 계정이 잠깁니다.
모든 것이 잠기는 것을 방지하기 위해 서버 목록을 실행하고 내 사용자 이름과 비밀번호로 로그인한 다음 로그아웃하는 스크립트를 만들고 싶습니다.
우리는 대부분의 시스템에서 RHEL 5를 실행하며 일부 OEL 6도 실행합니다(대부분 RHEL5).
주제를 인터넷 검색하면 SSH keygen 주제(우리가 가지고 있거나 사용하고 있는)가 계속 표시되지만, 네트워크 문제가 있어서 이동해야 하는 경우를 대비해 내 범용 계정이 다른 서버에서 항상 잠기지 않았으면 좋겠습니다. 직접 로그인하세요.
답변1
을 사용하는 것이 좋습니다 pssh
. SSH에 비밀번호 전달, 병렬 처리, 오류 처리 등의 기능이 내장되어 있습니다. 이것은 좋은 바퀴이므로 다른 바퀴를 만들 필요가 없습니다.
답변2
user1
귀하의 사용자 이름은 200개의 컴퓨터 모두에서 동일하다고 가정합니다.
먼저, 머신(예: 머신 1)에 공개 SSH 키를 만듭니다.
ssh-keygen -t rsa
로그인 후 처음으로 ssh 명령을 실행할 때마다 비밀번호를 묻는 메시지가 표시됩니다. 즉, 여러 개의 ssh
또는 scp
명령의 경우 한 번만 입력하면 됩니다. 그러나 완전히 비밀번호 없이 액세스하려면 공백으로 둘 수 있습니다.
네트워크에 있는 경우 모든 IP 주소를 에서 사용할 수 있습니다 /etc/hosts
.
IP 주소 또는 호스트 이름 목록을 가져와 호스트 이름만 포함된 파일에 저장할 수 있습니다.
내 거IP 목록 파일.txt다음과 같이.
192.168.1.11
192.168.1.12
공개 키를 생성한 후 이를 user1
네트워크의 모든 컴퓨터에 복사(예: )하세요.
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
(이 단계에서 아래 해결 방법 중 하나를 사용하지 않는 한) 각 IP에 대한 비밀번호를 수동으로 입력해야 하지만, 이렇게 하면 비밀번호를 사용하지 않고도 모든 시스템에서 스크립트를 실행할 수 있습니다.
이제 스크립트를 사용하여 모든 시스템에 SSH로 접속하고 주기적으로 로그아웃할 수 있습니다.
while read ip; do
ssh user1@$ip
exit
done < IPlistfile.txt
위의 스크립트는 cronjob
사용자 계정을 잠그지 않고 필요에 따라 서버에 로그인 및 로그아웃하기 위해 주기적으로 실행될 수 있습니다.
제 질문에 대한 답변을 참고해주세요네트워크에서 scp를 자동화하는 스크립트그것은 당신에게 더 많은 아이디어를 줄 것입니다.
답변3
RSA 키가 가장 좋은 솔루션이겠지만 이를 사용할 수 없다면 expect
다음과 같은 추악한 해킹을 수행해야 합니다.
#!/usr/bin/expect
set timeout 60
#set maxSpawn 20
if { $argc >= 2 } {
set user [lindex $argv 0]
set pass [lindex $argv 1]
set cmd ""
for {set i 2} {$i < $argc} {incr i 1} {
append cmd "[lindex $argv $i] "
}
#puts $cmd
} else {
exit
}
log_user 0
spawn sh -c "$cmd"
log_user 1
expect {
"$user:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"assword:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"(yes/no)?" {
send "yes\n";
exp_continue
}
"\[Y/n\]\?" {
send "y\n";
exp_continue
}
eof { exit }
timeout { exit }
default { exp_continue; }
}
ssh.exp로 저장하고 다음을 실행합니다.
ssh.exp your_username your_password ssh server exit