使用Expect在bash脚本中填充密码



我对bash工作相对陌生,我必须运行这个脚本的最大痛苦之一是在运行这个脚本时会反复提示输入密码。由于安全限制,我无法传递ssh密钥或使用除expect之外的任何选项,但我很难理解如何使用expect。

Expect是否需要一个独立于该脚本的文件来调用自己,看起来教程是这样的,但对于新用户来说,它们似乎相当复杂和令人困惑。此外,我如何在脚本中输入我希望它自动填写的任何提示密码:?此外,每次调用脚本时,该脚本都会使用3个独立的唯一变量运行。我如何确保这些信息已收集,但密码仍会自动填写?

我们非常感谢任何协助。

#!/bin/bash
zero=`echo $2`
TMPIP=`python bin/dgip.py $zero`
IP=`echo $TMPIP`
folder1=`echo $zero | cut -c 1-6`
folder2=`echo $zero`
mkdir $folder1
cd $folder1
mkdir $folder2
cd $folder2
scp $1@`echo $IP`:$3 .

在shell脚本中嵌入期望代码并不太困难。我们必须小心,以使报价正确。你会这样做:

#!/usr/bin/env bash
user=$1
zero=$2
files=$3
IP=$(python bin/dgip.py "$zero")
mkdir -p "${zero:0:6}/$zero"
cd "${zero:0:6}/$zero"
export user IP files
expect <<<'END_EXPECT'        # note the single quotes here!
set timeout -1
spawn scp $env(user)@$env(IP):$env(files) .
expect {assword:}
send "$env(my_password)r"
expect eof
END_EXPECT

在运行此操作之前,请将您的密码放入shell的导出环境变量中:

export my_password=abc123
bash script.sh joe zero bigfile1.tgz
bash script.sh joe zero bigfile2.tgz
...

话虽如此,公钥身份验证要安全得多。如果可能的话,可以使用它,或者让系统管理员启用它。

最新更新