Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: zpty woes



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. -- Jaime


On 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 debug
output.

#!/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 $result

I changed my credentials for security. Basically it now hangs waitng for
password 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





Messages sorted by: Reverse Date, Date, Thread, Author