expect 命令未在 ubuntu focal 中传递 env 变量

expect command is not passing env variable in ubuntu focal

我正在使用 expect (v5.45.4-2build1) 在 ubuntu focal 中使用 easy-rsa 自动生成客户端证书。 根据 easy-rsa,要自定义证书有效性,我们需要传递 EASYRSA_CERT_EXPIRE 变量。 但出于某种原因,我的期望脚本无法获取此变量。 这是 script.exp:

的代码
#!/usr/bin/expect -f

set timeout -1
#exp_internal 1

set MY_PASSPHRASE [lindex $argv 0];
set USERNAME [lindex $argv 1];
set ttl [lindex $argv 2];

send "export EASYRSA_CERT_EXPIRE=$ttl\r"
spawn /bin/bash

set MSG "Executing script.exp for $USERNAME and $ttl";
send "echo 'INFO $MSG'>> /var/log/app/my_app.log\r"

send "cd /etc/openvpn/easy-rsa\r"

send "export EASYRSA_CERT_EXPIRE=$ttl\r"

send "./easyrsa gen-req $USERNAME\r"
expect "*Enter PEM pass phrase:"
send -- "$MY_PASSPHRASE\r"
expect "*Verifying - Enter PEM pass phrase:"
send -- "$MY_PASSPHRASE\r"
expect "*Common Name *$USERNAME*"
send -- "\r"
expect "*Keypair and certificate request completed*"
send -- "\r"
exit 0

奇怪的是,如果我通过 expect script.exp 运行 脚本,这工作正常。 但是我想在我的 perl 脚本中使用它,但它在 perl 脚本中不起作用。

这就是我调用 expect 脚本的方式:

my $cmd_out_csr = system("expect script.exp $my_passphrase $username $ttl");

只是 运行ning,来自 cmd 的 expect script.exp $my_passphrase $username $ttl 工作正常。 任何帮助表示赞赏。 谢谢。

  1. 使用带有参数列表的 perl system 命令:

    system('expect', 'script.exp', $my_passphrase, $username, $ttl);
    
  2. 在远程 shell 中创建变量时,在值周围发送引号:

    send "export EASYRSA_CERT_EXPIRE=\"$ttl\"\r"
    

这两件事将保护 $ttl 的值,如果它包含空格。


另一个想法:期望(通过 Tcl)可以 cd 并设置环境变量。不是生成 bash shell,而是直接生成 easyrsa:

#!/usr/bin/expect -f

set timeout -1
#exp_internal 1

lassign $argv MY_PASSPHRASE USERNAME ttl

set f [open /var/log/app/my_app.log a]
puts $f "INFO Executing [info script] for $USERNAME and $ttl"
close $f

cd /etc/openvpn/easy-rsa
set env(EASYRSA_CERT_EXPIRE) $ttl

spawn ./easyrsa gen-req $USERNAME

expect "*Enter PEM pass phrase:"
send -- "$MY_PASSPHRASE\r"
expect "*Verifying - Enter PEM pass phrase:"
send -- "$MY_PASSPHRASE\r"
expect "*Common Name *$USERNAME*"
send -- "\r"
expect "*Keypair and certificate request completed*"
send -- "\r"
expect eof

puts "Done."