首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中使用expect执行带有密码请求的命令

在bash中使用expect执行带有密码请求的命令
EN

Unix & Linux用户
提问于 2022-05-21 07:56:59
回答 1查看 2.4K关注 0票数 0

我已经做了一段时间的工作,制作一个BASH脚本来遍历两个列表并从中创建一个命令。

最后,它应该执行命令并同步我的ZFS服务器和ZFS备份服务器。

只有当命令要求输入密码时,BASH才不能实际插入密码。

据我理解,这可以通过expect来实现。

命令存储在$ExecuteSyncoid中,如下所示

代码语言:javascript
复制
/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部分是

代码语言:javascript
复制
Enter passphrase for key ''

现在我不明白tcl/expect,但是我已经尝试过了,我一次也不能让它工作。

代码语言:javascript
复制
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 - <

我都试图制作一个独立的脚本

代码语言:javascript
复制
expect -f ./SynCoid-IterateThroughDataSets.exp $ExecuteSyncoid $PWD

带着密码

代码语言:javascript
复制
#!/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,那就太好了

向你问好,黑基尔

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-05-21 16:53:25

我不打算回顾每一个变体。然而,shell变量不会在单引号中展开。

看看最后一个变体:

壳部

代码语言:javascript
复制
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个参数。

总是引用你的变量:

代码语言:javascript
复制
expect -f ./SynCoid-IterateThroughDataSets.exp "$ExecuteSyncoid" "$PassWord"

期待部分

代码语言:javascript
复制
#!/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的论证展开语法:

代码语言:javascript
复制
spawn {*}$ExecuteSyncoid

发送时不希望转义expect PWD变量:删除第一个反斜杠

代码语言:javascript
复制
send "$PWD\r"

除非您在expect中执行其他操作,否则在发送密码之后,expect脚本将退出,这将扼杀syncoid进程。expect脚本的最后一行应该是:

  • 如果你,人类,需要和同步体互动
  • 如果您不需要交互,请期待
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/703353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档