"zipcloak" II와 함께 "expect"를 어떻게 사용합니까?

"zipcloak" II와 함께 "expect"를 어떻게 사용합니까?

이 질문은 후속 질문입니다.이 문제, 이전 질문에서 제안한 솔루션이 더 이상 작동하지 않는다는 것을 알았기 때문입니다. 때로는 작동했지만 지금은 expect예상대로 작동하지 않습니다. 전체 코드는 다음과 같습니다.

#!/bin/bash
MYPWD="mypassword"

expect -c ' 
    spawn zipcloak test.upd
    expect "*Enter password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    expect "*Verify password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    '

이 bash 스크립트는 파일을 암호화하지 않지만 , 또는 test.upd와 같이 내 디렉토리에 "zi"로 시작하는 파일을 생성합니다 .zi0gA1rUzi8Vv6OD

왜 그런 겁니까? 그 서류는 무엇입니까? 위 스크립트가 때로는 작동하고 때로는 작동하지 않는 이유는 무엇입니까? 적절하게 행동 하는 방법은 없을까요 expect?

zipcloak사용하지 않도록 다시 작성할 수 있는 소스 코드는 어디에서 찾을 수 있습니까 expect?

추가 정보:

  • rootzip 파일에는 루트 권한이 있으므로 이 명령을 실행해야 합니다 . 어쩌면 이것이 중요할까요?

    zipcloak -v Copyright (c) 1990-2008 Info-ZIP - 소프트웨어 라이센스를 얻으려면 "zipcloak "-L""을 입력하십시오.

    Info-ZIP에서 개발한 ZipCloak 3.0(2008년 7월 5일)입니다. 현재 E. Gordon이 관리하고 있습니다. 자세한 내용은 README를 참조하여 작성자에게 버그 보고서를 보내려면 www.info-zip.org 웹 페이지를 사용하십시오.

    최신 소스 코드와 실행 파일은 다음 위치에 있습니다.ftp://ftp.info-zip.org/pub/infozip, 위 날짜를 참조하세요.http://www.info-zip.org/다른 웹사이트의 경우.

    2011년 6월 11일 Unix(Linux ELF)용 gcc 4.6.1로 컴파일되었습니다.

    ZipCloak 특수 컴파일 옵션: [암호화, 버전 2.91, 2007년 1월 5일]

sleep작동이 중지되면 마지막 항목을 2로 설정해야 합니다 . 그런 다음 다시 작동했습니다. 하지만 그것도 작동하지 않았습니다. 그래서 시간을 sleep5초로 설정했습니다. 현재 내 스크립트가 실행 중입니다. 그러나 신뢰할 수 없습니다.

설정된 디버깅 출력을 사용하십시오 exp_internal 1.

spawn /usr/bin/test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {28746}

expect: does "" (spawn_id exp6) match glob pattern "*Enter password*"? no
Enter password: 
expect: does "Enter password: " (spawn_id exp6) match glob pattern "*Enter password*"? yes
expect: set expect_out(0,string) "Enter password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "XXX\r" to { exp6 }

expect: does "" (spawn_id exp6) match glob pattern "*Verify password*"? no

Verify password: 
expect: does "\r\nVerify password: " (spawn_id exp6) match glob pattern "*Verify password*"? yes
expect: set expect_out(0,string) "\r\nVerify password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "\r\nVerify password: "
send: sending "XXX\r" to { exp6 }
argv[0] = expect  argv[1] = -c  argv[2] = 
    exp_internal 1
    spawn /usr/bin/zipcloak "test.upd"
    expect "*Enter password*"
    sleep 1
    send  "XXX\r"
    sleep 1
    expect "*Verify password*"
    sleep 1
    send  "XXX\r"
    sleep 1

set argc 0
set argv0 "expect"
set argv ""

고쳐 쓰다:Glenn이 게시한 두 번째 스크립트의 출력은 다음과 같습니다.

spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {9956}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
Enter password:
expect: does "Enter password: " (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "mypassword\r" to { exp6 }
expect: continuing expect

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
mypassword

expect: does "mypassword\r\n" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
expect: timed out
argv[0] = expect  argv[1] = -c  argv[2] =
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: $} {send "mypassword\r"; exp_continue}
        eof
    }

set argc 0
set argv0 "expect"
set argv ""

고쳐 쓰다

실제로 코드를 호출하기 위해 명령줄에 파일 이름과 비밀번호를 지정하고 싶습니다.

./myscript.sh test.upd pass

스크립트는 다음과 같습니다.

#!/bin/bash
expect -c " 
    exp_internal 1
    spawn zipcloak \"$1\"
    expect {
        -re {password: \$} {send \"$2\r\"; exp_continue}
        expect eof
    }
"

그러나 로 시작하는 파일을 다시 생성하고 zi실제 파일을 암호화하지는 않습니다. 나는 로직의 작은 변화로 인해 예상 스크립트의 전체 작업 흐름이 중단될 것이라는 것을 전혀 몰랐습니다. 출력은 다음과 같습니다.

spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {16791}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
Enter password:
expect: does "Enter password: " (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "pass\r" to { exp6 }
expect: continuing expect

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
pass

expect: does "pass\r\n" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
expect: timed out
argv[0] = expect  argv[1] = -c  argv[2] =
    exp_internal 1
    spawn zipcloak "test.upd"
    expect {
        -re {password: $} {send "pass\r"; exp_continue}
        expect eof
    }

set argc 0
set argv0 "expect"
set argv ""

답변1

나는 zipcloak-er를 다음과 같이 쓸 것이다.

#!/usr/bin/env expect
set zipfile [lindex $argv 0]
if {![file exists $zipfile]} {error "no such zipfile: $zipfile"}
set pass "mypassword"
spawn zipcloak $zipfile
expect {
    -re {password: $} {send "$pass\r"; exp_continue}
    eof
}

exp_continue"비밀번호 입력:" 및 "비밀번호 확인:" 프롬프트에는 공통 접미사가 있으므로 코드를 재사용하는 것이 좋습니다.


"작동하지 않음"은 도움이 되지 않습니다. 사용해 보셨나요 exp_internal 1? 이 시도:

#!/bin/bash
MYPWD="mypassword"

expect -c " 
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: \$} {send \"$MYPWD\\r\"; exp_continue}
        eof
    }
"

죄송합니다 알렉스, 귀하의 질문을 이해하지 못합니다. 이것이 Bash에서 나에게 일어나는 일이다:

$ zip test.upd file
  adding: file (deflated 22%)
$ MYPWD="mypassword"
$ expect -c " 
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: \$} {send \"$MYPWD\\r\"; exp_continue}
        eof
    }
"
spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {27485}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
Enter password: 
expect: does "Enter password: " (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "Enter password: "
send: sending "mypassword\r" to { exp4 }
expect: continuing expect

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no

Verify password: 
expect: does "\r\nVerify password: " (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nVerify password: "
send: sending "mypassword\r" to { exp4 }
expect: continuing expect

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no


expect: does "\r\n" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
encrypting: file

expect: does "\r\nencrypting: file\r\n" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
expect: read eof
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nencrypting: file\r\n"
argv[0] = expect  argv[1] = -c  argv[2] =  
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: $} {send "mypassword\r"; exp_continue}
        eof
    }

set argc 0
set argv0 "expect"
set argv ""

관련 정보