我已经做了一段时间的工作,制作一个BASH脚本来遍历两个列表并从中创建一个命令。
最后,它应该执行命令并同步我的ZFS服务器和ZFS备份服务器。
只有当命令要求输入密码时,BASH才不能实际插入密码。
据我理解,这可以通过expect来实现。
命令存储在$ExecuteSyncoid中,如下所示
/usr/sbin/syncoid @:Storage/WallaBag Storage/Docker/WallaBag --compress none --sshcipher chacha20-poly1305@openssh.com --sshport --sshkey --no-privilege-elevation密码存储在$PWD中
现在,我必须从BASH内部执行expect,因为我并不想尝试重新创建expect/tcl中的所有代码,这是我以前从未尝试过的。
expect部分是
Enter passphrase for key ''现在我不明白tcl/expect,但是我已经尝试过了,我一次也不能让它工作。
expect -c 'expect "Enter" { spawn $ExecuteCommand; send -- "$PWD\r"; interact }'
expect -c 'spawn $ExecuteSyncoid; expect "Enter"; send -- "$PWD\r"; interact'
syncoid command/password
/usr/bin/expect - <我都试图制作一个独立的脚本
expect -f ./SynCoid-IterateThroughDataSets.exp $ExecuteSyncoid $PWD带着密码
#!/usr/bin/expect -f
set ExecuteSyncoid [lindex $argv 0];
set PWD [lindex $argv 1];
spawn $ExecuteSyncoid
expect "Enter"
send "\$PWD\r"但不幸的是,我无法理解如何使expect将$ExecuteSyncoid命令视为一个一致的命令。如果我把它放在商项中,它就不会执行它。如果我没有把它放在引号中,那么$ExecuteSyncoid bash变量在expect中被认为是多个参数。
如果有人知道如何解决这个问题,或者知道该怎么做,我会很感激的。
如果我能够在expect命令执行$ExecuteSyncoid时对它的输出进行sse,那就太好了
向你问好,黑基尔
发布于 2022-05-21 16:53:25
我不打算回顾每一个变体。然而,shell变量不会在单引号中展开。
看看最后一个变体:
壳部
ExecuteSyncoid="/usr/sbin/syncoid @:Storage/WallaBag Storage/Docker/WallaBag --compress none --sshcipher chacha20-poly1305@openssh.com --sshport --sshkey --no-privilege-elevation"
PassWord="abc123" # Don't use PWD!
expect -f ./SynCoid-IterateThroughDataSets.exp $ExecuteSyncoid $PassWord由于变量没有被引用,他们体验了分词:expect脚本将看到13个参数,而不是2个参数。
总是引用你的变量:
expect -f ./SynCoid-IterateThroughDataSets.exp "$ExecuteSyncoid" "$PassWord"期待部分
#!/usr/bin/expect -f
set ExecuteSyncoid [lindex $argv 0];
set PWD [lindex $argv 1]; # this has nothing to do with the shell's PWD variable
spawn $ExecuteSyncoid
expect "Enter"
send "\$PWD\r"现在shell变量被引用了,expect变量ExecuteSyncoid是一个包含空格的单词。
spawn命令需要扩展这个单词,所以我们将使用Tcl的论证展开语法:
spawn {*}$ExecuteSyncoid发送时不希望转义expect PWD变量:删除第一个反斜杠
send "$PWD\r"除非您在expect中执行其他操作,否则在发送密码之后,expect脚本将退出,这将扼杀syncoid进程。expect脚本的最后一行应该是:
https://unix.stackexchange.com/questions/703353
复制相似问题