일부 명령()을 사용하여 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