I have an error trying to run a .sh file
line 2: spawn: command not found
": no such file or directory
bash.sh: line 3: expect: command not found
bash.sh: line 4: send: command not found
#!/usr/bin/expect -f
spawn sftp -o IdentityFile=MyFile.ppk 500200243@XXX.XXX.XXX.XXX
expect "XXX.XXX.XXX.XXX.gatewayEnter passphrase for key 'MyFile.ppk.ppk':"
send "myPassword"
Any idea why it happens?
It works OK for me (error from sftp: ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known
), though the .sh
extension for an expect (tcl) script is a little off-putting ;-)
Often when this sort of unexplainable/unpredictable behavior happens, it is because the script was edited under windows (notepad.exe), which uses \r\n
to delimit lines. This plays havoc with unix/linux scripts, as only \n
is expected as a line delimiter.
You can use the dos2unix
and unix2dos
utilities to convert between the two formats. As an experiment, I converted your script to "dos" format, and sure enough got a similar error:
ubuntu@ubuntu:~$ unix2dos bash.sh
unix2dos: converting file bash.sh to DOS format ...
ubuntu@ubuntu:~$ ./bash.sh
": no such file or directory
ubuntu@ubuntu:~$ dos2unix bash.sh
dos2unix: converting file bash.sh to Unix format ...
ubuntu@ubuntu:~$ ./bash.sh
spawn sftp -o IdentityFile=MyFile.ppk 500200243@XXX.XXX.XXX.XXX
ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known
Couldn't read packet: Connection reset by peer
send: spawn id exp6 not open
while executing
"send "myPassword""
(file "./bash.sh" line 4)
ubuntu@ubuntu:~$
- that is an expect script, so ".exp" would be an appropriate file extension:
mv bash.sh sftp.exp
- do not launch it like
bash bash.sh
or sh bash.sh
. Do this:
- make the program executable:
chmod a+x sftp.exp
- launch it with
./sftp.exp
or /path/to/sftp.exp
or move it to a directory in your $PATH and launch it just with sftp.exp
- after you
send "myPassword"
you have to "hit enter": send "myPassword\r"
- while developing an expect program, add
exp_internal 1
to the top.
Good luck, and come back with further questions.
It seems /usr/bin/expect haven't been installed in your machine. So you will get 'command not found'
Use which expect
to check, and install it to correct path.
It all depends on how you invoke the command. Like ray said, even if you specify the environment with a bang at the top, you still have to run it using expect -f.
I was also getting the same error. it got resolved by using expect in following way:
DIRNAME=$(date +%F:%T)
expect_sh=$(expect -c "
spawn scp -r ABC xxx@yyy.yy.yy.yyy:/root/$DIRNAME
expect \"password:\"
send \"xxxx\r\"
expect \"#\"
spawn ssh -o StrictHostKeychecking=no xxx@yyy.yy.yy.yyy
expect \"password:\"<
send \"xxxx\r\"
expect \"#\"
send \"rm -f /root/$DIRNAME/abc.txt\r\"
expect \"#\"
send \"scp -r /root/$DIRNAME/* root@zzz.zz.zz.zzz:/root/ABC/\r\"
expect \"password:\"
send \"xxxxx\r\"
expect \"#\"
send \"exit \r\"
")<b
echo "$expect_sh"