>  기사  >  운영 및 유지보수  >  Linux는 자세한 설명을 기대합니다.

Linux는 자세한 설명을 기대합니다.

藏色散人
藏色散人앞으로
2019-08-09 14:22:549470검색

Linux는 자세한 설명을 기대합니다.

expect는 어디에서나 볼 수 있습니다

expect 명령을 처음 본 것은 제가 처음으로 정식 출시에 참여했을 때였습니다. 실력 있는 분이 직접 작성한 자동 배포 및 MD5 비교 세트였습니다. 예, 본격적인 온라인 도구가 출시되었습니다. 할 일이 없을 때 몇 가지 스크립트와 많은 기대 명령을 읽었습니다. 나는 Expect 명령의 사용법을 정말로 이해할 수 없었기 때문에, 이번 기사를 Expect 명령에 대해 요약해 보는 시간을 가졌습니다.

추천: [Linux 동영상 튜토리얼]

먼저 질문을 해주세요

이제 두 개의 Linux 호스트 A와 B가 있는데 호스트 A에서 호스트 B로 ssh를 보낸 다음 호스트 B에서 명령을 실행하는 방법은 무엇입니까? ? 이 프로세스를 완전히 자동화할 수 있나요? 다음 방법을 사용할 수 있습니다.

ssh admin@10.220.20.15 "ls"

하지만 이 방법은 매번 비밀번호를 입력해야 하고 일부 복잡한 논리나 명령을 실행할 수 없습니다. 그렇다면 완전 자동화를 실현하는 방법은 무엇입니까? 이는 오늘 기사에 요약된 기대치를 사용합니다.

무엇이 예상되나요?

expect는 사람의 개입 없이 대화형 작업을 자동화하는 데 사용되는 무료 프로그래밍 도구입니다. 직설적으로 말하자면, Expect는 자동 상호 작용 기능을 구현하는 데 사용되는 소프트웨어 세트입니다.

실제 작업에서 명령, 스크립트 또는 프로그램을 실행할 때 이러한 명령, 스크립트 또는 프로그램을 터미널에서 계속 실행하려면 특정 지침이 필요하며 이러한 입력은 수동으로 수행되어야 합니다. Expect를 사용하면 프로그램 프롬프트에 따라 프로그램에 제공되는 표준 입력을 시뮬레이션하여 자동화된 대화형 실행을 달성할 수 있습니다. 이것이 예상되는 것입니다! ! !

expect basics

expect를 사용할 때 기본적으로 다음 네 가지 명령을 처리합니다.

Linux는 자세한 설명을 기대합니다.

send 명령은 문자열 매개변수를 받아 프로세스에 매개변수를 보냅니다.

expect 명령은 send 명령과 반대입니다. Expect 명령은 일반적으로 프로세스의 피드백을 기다리는 데 사용됩니다. 그런 다음 프로세스의 피드백을 기반으로 해당 대화형 명령을 보냅니다.

spawn 명령은 새로운 프로세스를 시작하는 데 사용됩니다. 생성 후 send 및 Expect 명령은 둘 다 생성을 사용하여 열린 프로세스와 상호 작용합니다.

사실 상호 작용 명령은 많이 사용되지 않습니다. 일반적으로 generate, send 및 Expect 명령은 작업을 잘 완료할 수 있지만 일부 특별한 경우에는 여전히 상호 작용 명령을 주로 사용해야 합니다. 자동화를 종료하려면 인간 상호 작용을 시작하십시오. 예를 들어, ftp 로그인 호스트를 완료하고 파일 다운로드 작업을 수행하기 위해 generate, send 및 Expect 명령을 사용합니다. 그러나 파일 다운로드가 완료된 후에도 ftp 명령줄 상태를 계속 유지할 수 있기를 바랍니다. 후속 명령을 수동으로 실행할 수 있습니다. 이 경우 상호 작용 명령을 사용하면 이 작업을 매우 잘 완료할 수 있습니다.

실용 코드 분석

Expect는 위에 요약되어 있으며, 특히 일반적으로 사용되는 일부 명령에 대해 자세히 설명합니다. 다음은 일반적으로 사용되는 몇 가지 예상 스크립트를 통해 예상을 사용하여 일부 일일 작업을 완료하는 방법에 대한 자세한 설명입니다.

#!/usr/tcl/bin/expect
set timeout 30
set host "101.200.241.109"
set username "root"
set password "123456"
spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

이것은 예상의 기본 사용법을 보여주는 매우 간단한 예상 샘플 코드입니다.

#!/usr/tcl/bin/expect: 스크립트를 해석하려면 예상을 사용하세요.

set timeout 30: 시간 제한을 초 단위로 설정합니다. 기본값은 10초입니다.

set 호스트 "101.200.241.109": 변수 설정 ;

spawn ssh $username@$host:spawn은 Expect 환경에 진입한 후 실행될 수 있는 Expect의 내부 명령입니다. 주요 기능은 ssh 실행 프로세스에 셸을 추가하여 대화형 지침을 전달하는 것입니다.

expect "*password*": 여기서는 Expect의 내부 명령이기도 합니다. 이 명령은 마지막 출력 결과가 문자열인지 확인하는 것을 의미합니다. "password"가 있으면 즉시 반환되고, 그렇지 않으면 일정 시간 후에 반환됩니다. 여기서 대기 시간은 이전에 설정된 30초입니다.

send "$passwordr": 해당 출력 결과는 다음과 같습니다. 일치하면 열려 있는 SSH 프로세스에 비밀번호를 보내고 대화형 작업을 수행합니다.

interact: 실행이 완료된 후에도 대화형 상태를 유지하고 이때 제어권을 콘솔로 전달할 수 있습니다. 해당 문장이 없을 경우 원격 단말기에 머무르지 않고 로그인 완료 후 종료됩니다.

위의 간단한 스크립트에 대한 분석입니다. 위의 예에서는 모드 동작이라는 매우 중요한 개념이 포함됩니다. 즉, 위의 예상 "*password*" {send "$passwordr"} 의미입니다. 이 코드로 표현됩니다.

Mode-Action

"*password*" {send "$passwordr"}를 예상하는 코드와 결합하여 "Mode-Action"에 대해 이야기해 보겠습니다. 간단히 말하면, 패턴이 일치하면 해당 작업이 수행되고, 비밀번호 문자열이 일치하면 비밀번호가 입력됩니다. 다음과 같은 코드도 볼 수 있습니다:

expect {
    "password" {
        send "$password\r"
        exp_continue
    }
    eof
    {
        send "eof"
    }
}

其中exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

传参

很多时候,我们需要传递参数到脚本中,现在通过下面这段代码来看看如何在expect中使用参数:

#!/usr/tcl/bin/expect
if {$argc < 3} {
    puts "Usage:cmd <host> <username> <password>"
    exit 1
}
set timeout -1
set host [lindex $argv 0] 
set username [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

在expect中,\$argc表示参数个数,而参数值存放在$argv中,比如取第一个参数就是[lindex $argv 0],以此类推。

总结

能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。

위 내용은 Linux는 자세한 설명을 기대합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jellythink.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제