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
工作正常。
任何帮助表示赞赏。
谢谢。
使用带有参数列表的 perl system
命令:
system('expect', 'script.exp', $my_passphrase, $username, $ttl);
在远程 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."
我正在使用 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
工作正常。
任何帮助表示赞赏。
谢谢。
使用带有参数列表的 perl
system
命令:system('expect', 'script.exp', $my_passphrase, $username, $ttl);
在远程 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."