이 질문은 후속 질문입니다.이 문제, 이전 질문에서 제안한 솔루션이 더 이상 작동하지 않는다는 것을 알았기 때문입니다. 때로는 작동했지만 지금은 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"로 시작하는 파일을 생성합니다 .zi0gA1rU
zi8Vv6OD
왜 그런 겁니까? 그 서류는 무엇입니까? 위 스크립트가 때로는 작동하고 때로는 작동하지 않는 이유는 무엇입니까? 적절하게 행동 하는 방법은 없을까요 expect
?
zipcloak
사용하지 않도록 다시 작성할 수 있는 소스 코드는 어디에서 찾을 수 있습니까 expect
?
추가 정보:
root
zip 파일에는 루트 권한이 있으므로 이 명령을 실행해야 합니다 . 어쩌면 이것이 중요할까요?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로 설정해야 합니다 . 그런 다음 다시 작동했습니다. 하지만 그것도 작동하지 않았습니다. 그래서 시간을 sleep
5초로 설정했습니다. 현재 내 스크립트가 실행 중입니다. 그러나 신뢰할 수 없습니다.
설정된 디버깅 출력을 사용하십시오 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 ""