【问题标题】:Expect command in bash script期望在 bash 脚本中的命令
【发布时间】:2014-08-11 05:14:21
【问题描述】:

我在使用 bash 变量执行期望命令时遇到问题。我有脚本参数给出的位置,我需要通过expect -c在发送命令中使用它。但我需要用 " 给出它,所以实际上发送命令认为我已经结束输入并且在关闭引号后将其余命令识别为额外字符。事情就像:

#!/bin/bash

SIGN=ppp

expect -cd 'spawn ssh user@host
            expect "Password:"
            send -- "pass\r"
            expect "*~>"
            send -- "find /local/"$SIGN"/ -maxdepth 1 -type d -mtime +30 |xargs rm -rfv\r"
            expect "*~>"
            send -- "exit\r"'

知道如何在不使用双引号的情况下将变量从 bash 发送到期望吗?顺便说一句 - 我不能为 ssh 使用密钥

【问题讨论】:

    标签: linux bash shell ssh expect


    【解决方案1】:

    你可以这样逃跑'"$SIGN"':

    例如:

    #!/bin/bash
    
    SIGN=ppp
    
    expect  -c 'spawn ssh tiago@localhost
                expect "password:"
                send -- "mypass\r"
                expect "~"
                send -- "echo '"$SIGN"'\r"
                expect "^ppp"
                send -- "exit\r"'
    

    【讨论】:

      【解决方案2】:

      如果您只是删除 $SIGN 周围的 "s" 会发生什么?

      send -- "find /local/$SIGN/ -maxdepth 1 -type d -mtime +30 |xargs rm -rfv\r"

      或者尝试在它周围使用 {}。

      send -- "find /local/${SIGN}/ -maxdepth 1 -type d -mtime +30 |xargs rm -rfv\r"

      【讨论】:

      • 没有它,它不会将其视为变量:无法读取“SIGN”:没有这样的变量。 {} 也一样
      • 很奇怪。我认为这是因为它位于第一行的'' 内。您可以将它们作为一些期望命令发送吗?每行一个并跳过''s?我确信有更好的方法,但这就是我要开始的地方
      • 我实际上不明白。多个期望命令?它不会破坏 ssh 会话吗?你能给我一个提示吗? :) 实际上我根本不熟悉期望
      • 我也不熟悉expect。我只是在看 bash 语法。我认为问题在于使用单引号来包含整个字符串。看看这个链接stackoverflow.com/a/9420853/3757019。不知道答案是什么,但我认为你需要使用" 而不是'
      【解决方案3】:

      您可以将该变量放入环境中:

      export SIGN=ppp
      
      expect -cd '
          spawn ssh user@host
          expect "Password:"
          send -- "pass\r"
          expect "*~>"
          send -- "find /local/$env(SIGN)/ -maxdepth 1 -type d -mtime +30 |xargs rm -rfv\r"
          # ...................^^^^^^^^^^
          expect "*~>"
          send -- "exit\r"
      '
      

      【讨论】:

        【解决方案4】:

        我又遇到了一个问题:send -- "find /local/'"$SIGN"'/ -maxdepth 1 -type d -mtime +30 |grep -v '"$FILTER"' |xargs rm - rfv\r" 此命令未执行。至少它正确地放置了变量值。但是通过 xargs 将文件夹列表发送到 rm 可能有问题?

        【讨论】:

          猜你喜欢
          • 2016-09-06
          • 2017-06-11
          • 2016-10-01
          • 2016-02-28
          • 1970-01-01
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          • 2018-10-01
          相关资源
          最近更新 更多