while/for 루프에서 SSH 매개변수를 사용하지 않을 것으로 예상됩니다.

while/for 루프에서 SSH 매개변수를 사용하지 않을 것으로 예상됩니다.

일부 명령()을 사용하여 dmidecode많은 호스트에 대한 원격 시스템 세부 정보를 얻으려고 합니다.expect

expect아래는 이 목적으로 사용하는 스크립트 입니다 .

while read i; do
{
/usr/bin/expect<<EOF
 spawn ssh "root@$i" dmidecode 
 expect "Password:"
 send "xxxx\r";
 interact
 EOF
  }
 done<iplist 

그러나 여기의 명령은 원격 컴퓨터에서는 실행되지 않습니다. 나는 작은 따옴표, 큰 따옴표 및 캐럿을 사용해 보았지만 여전히 성공하지 못했습니다.

여기서는 원격 명령을 매개변수로 실행하고 싶습니다. 예를 들면 다음과 같습니다.ssh <ip> <remote command>

몇 가지 조언을 해주세요. 일부 매개변수가 누락되었을 수 있습니다. 도와주세요.

답변1

while한 가지 단순화는 버그가 있고 느린 쉘 루프를 제거하는 것입니다 stdin. interact즉, 입력 파일이 expect스크립트의 TCL 코드로 전달되고 읽혀집니다.

#!/usr/bin/expect

if {[llength $argv] != 1} {
    puts stderr "Usage: $0 iplist-file"
    exit 1
}

set ipfh [open [lindex $argv 0]]

while {[gets $ipfh ip] >= 0} {
    spawn ssh root@$ip dmidecode
    expect "Password:"
    send "Hunter2\r";
    interact
}

답변2

thrig는 훌륭한 답변을 가지고 있습니다. bash를 계속 사용하려면(읽는 동안 루프가 매우 느리고 구문을 올바르게 가져오는 것이 지루하더라도) 다른 파일 설명자를 사용하여 파일에서 읽고 Expect가 stdin을 보존하도록 허용하세요.

while IFS= read -r -u3 ip; do
# .................^^^
    /usr/bin/expect << EOF
        spawn ssh "root@$ip" dmidecode 
        expect "Password:"
        send "xxxx\r";
        interact
EOF
done 3< iplist 
# ...^^

dmidecode 명령에 사용자 상호 작용이 필요하지 않은 경우 interact다음으로 변경하십시오.expect eof

관련 정보