On May 19, 2008, at 11:25 PM, Jaime Vargas wrote:
More strange behavior. In the script below, two different functions doTask and doShellTask are required because when invoking a shell script the prompt is repeated and if a read is not done twice then `zpty -d ch' will kill the session. This is kind of weird, the same happens with the `pwd' command.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