Is there a way to avoid this "double prompt" problem? (It is kind of hard which commands would require double reads.)
#!/opt/csw/bin/zsh
# FLAGS
set -x # Turn on to debug
zmodload zsh/zpty
# HELPERS
die () {print -r -- $1 >&2; exit 1;}
doTask () {
zpty -w ch $1
zpty -t ch || die "Error: command $1 didn't return"
zpty -r ch line "*aoma6000-4-9? "
print $line
}
doShellTask () {
zpty -w ch $1
zpty -t ch || die "Error: command $1 didn't return"
zpty -r ch line "*aoma6000-4-9? "
zpty -r ch line "*aoma6000-4-9? "
print $line
}
# CREDENTIALS
user='user'
pass='topsecret'
supw='topsecret'
host='host'
# TASKS
task1='cat >test <<"EOF"
#!/bin/zsh
who -r
uname -a
echo hello >test2.out
EOF
chmod +x test
'
# CONNECT
zpty -b ch ssh -l ${user} ${host}
zpty -t ch || die "connection failed"
zpty -r ch line "*assword:" || die "no password asked"
zpty -w ch ${pass}
zpty -r ch line "*aoma6000-4-9? "; print $line
doTask 'ls -ltr'
doTask ${task1}
doShellTask './test >test.out'
doShellTask 'pwd'
# DISCONNECT
zpty -d ch
On May 15, 2008, at 1:53 PM, Jaime Vargas wrote:
I got it working. By changing the pattern to '*assword:'. Thanks for the help. -- JaimeOn May 15, 2008, at 1:38 PM, Jaime Vargas wrote:Still no luck. Am I missing something stupid? nerd% ./zpty-test.zsh +./zpty-test.zsh:4> zmodload zsh/zpty +./zpty-test.zsh:8> zpty scppty scp hello.world 'user@host:~/' +./zpty-test.zsh:9> zpty -t scppty +./zpty-test.zsh:10> zpty -r scppty line assword: #!/opt/csw/bin/zsh set -x zmodload zsh/zpty die() {print -r -- $1 >&2; exit 1;} zpty scppty scp hello.world user@host:~/ zpty -t scppty || die "fuck" zpty -r scppty line "assword:" || die "no password asked" zpty -w scppty "TopSecret" while zpty -r scppty line; do result+="$line"$'\n' done zpty -d scppty print $result On May 15, 2008, at 1:03 PM, Stephane Chazelas wrote:On Thu, May 15, 2008 at 12:00:25PM -0400, Jaime Vargas wrote:Still doesn't work for me. Below is the modified script and the debugoutput. #!/opt/csw/bin/zsh set -x zmodload zsh/zpty die() {print -r -- $1 >&2; exit 1;} zpty scppty scp hello.world jvargas@xxxxxxxxxxxxxxxxxxxxxxxxxxx:~/ zpty -t scppty || die "fuck" zpty -r scppty line "*:" || die "no password asked" zpty -w scppty "3lp&tbw" while zpty -r scppty line; do result+="$line"$'\n' done zpty -d scppty print $resultI changed my credentials for security. Basically it now hangs waitng forpassword and doesnt' do anything. -- Jaime nerd% ./zpty-test.zsh +./zpty-test.zsh:5> zmodload zsh/zpty +./zpty-test.zsh:10> zpty scppty scp hello.world 'luser@host:~/' +./zpty-test.zsh:11> zpty -t scppty +./zpty-test.zsh:12> zpty -r scppty line '*:'Had you printed $line, you'd have seen something like "+myscript:", not "Passwd: ". [...]+./zpty-test.zsh:14> zpty -r scppty line[...] As Peter said, if you don't provide with a pattern to look for, zpty will look for NL characters. That last zpty is probably still waiting because so far, it has only received "Password: " and is waiting for a NL character that will never come. So, in your code above, you should wait for something more specific than just ":": zpty -r scppty line "assword: " || die "no password asked" for instance. -- Stéphane