$pass
в сценарии expect
представляет собой переменную TCL, которая не имеет ничего общего с переменными оболочки или их неудачным совпадением со строками, переданными в качестве окружения (см. справочную страницу environ(7)
). В TCL к среде можно получить доступ через переменную env
(, см. справочную страницу tclvars(n)
). Итак,
$ cat envtest
#!/usr/bin/env expect
puts $env(pass)
set pass $env(pass)
puts $pass
$ chmod +x envtest
$ export pass=Hunter2
$./envtest
Hunter2
Hunter2
$
Следовательно, ваш код expect
может быть записан как
#!/usr/bin/expect -f
spawn ssh bandit1@bandit.labs.overthewire.org -p 2220 -l bandit1
expect "assword:"
send $env(pass)
interact
для прямого доступа к pass
строке окружения (ну, в любом случае, к одному из них, так как мало что мешает созданию повторяющихся переменных окружения...)
Существует также множество других способов обработки паролей в expect
, не связанных с проблемами среды (, которые могут быть переданы дочерним процессам и прочитаны ими... ).
Что-то вроде:
autoload -U zmv
mkdir-and-mv() {
mkdir -p -- "$2:h" &&
mv -- "$@"
}
typeset -A c
c=(
blue colors
red colors
apple fruits
banana fruits
)
zmv -n -P mkdir-and-mv "(**/)((${(j:|:)${(@bk)c}}).txt)" '$1$c[$3]/$2'
(снимите -n
для сухого хода -если все устраивает)