Você poderia colocar o programa expect em um script separado (vamos chamá-lo de sftp.expect
) e passar o nome de usuário / senha como argumentos para ele.
Isto tem o problema que os argumentos da linha de comando são visíveis para outros usuários no sistema , então esta não é a melhor maneira de lidar com senhas, e você realmente não quero fazer isso com senhas em um sistema compartilhado.
#!/usr/bin/expect -f
set un [lindex $argv 0];
set pw [lindex $argv 1];
set sl [lindex $argv 2];
spawn /usr/bin/sftp -o KexDHMin=1024 $un@$sl.mysteriouslocation.com
set timeout -1
expect *Authentication
expect Password*
send "$pw\r"
Em seguida, execute isso a partir do script de shell com
#!/bin/bash
un=$(cat /home/vf/workflow/.udf/.u/.u"$1")
pw=...
sl=...
expect -f sftp.expect "$un" "$pw" "$sl"
Ou se você quiser manter o script esperado dentro do mesmo script de shell, coloque-o em um documento here:
#!/bin/bash
un=foo
# ...
expect -f - "$un" <<'EOF'
set un [lindex $argv 0];
send "user is: $un\r\n"
# ...
EOF
(observe as aspas em torno de EOF
, não queremos que o shell interprete as variáveis no heredoc.)