【问题标题】:How to simulate two consecutive ENTER key presses for a command in a bash script?如何模拟 bash 脚本中命令的两次连续 ENTER 按键?
【发布时间】:2015-06-08 14:38:20
【问题描述】:

[已编辑] 它可以被视为 [this question][1] 的扩展。 echo | command 上述命令可用于为命令的第一个输入请求提供一个“ENTER”字符。

如何在第二个输入请求中为同一命令提供下一个“ENTER”字符。

如果需要任何其他详细信息,请发表评论。

我正在给出我想要实现的具体示例。 我需要在我的 shell 脚本中运行 SSH-keyGen commmand。 它将要求以下输入:

  1. 输入目标文件名
  2. 输入密码
  3. 再次输入密码

我们如何将这三个输入传递给命令?

我试过了,

echo -ne "\n \n"| ssh-keygen  //which is passing two new lines for the first input request only.

echo -ne "\n"|(echo -ne "\n"|ssh-keygen)// but still no positive result

注意:以上两个命令中我避免了输入文件名的请求,只是为了简单

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    例如,您可以使用任一

    echo -e "\n"
    

    echo -en "\n\n"
    

    -e 选项告诉echo 解释转义字符。 \n 是换行符(回车)。因此,由于\n,第一个打印一个换行符,然后另一个因为echo 通常附加一个换行符。

    -n 选项告诉echo 禁止添加隐式换行符。要获得两个换行符,您需要指定两个 \n

    编辑:

    这里的问题是ssh-keygen 是特殊的。出于安全考虑,密码不是从标准输入读取,而是直接从终端读取!要提供密码(即使是空的),您需要使用 -P 选项。由于您只需要一个 ENTER(用于文件路径提示),因此该命令应该可以工作:

    echo | ssh-keygen -P ''
    

    (注意两个',中间没有空格:它们很重要!)

    【讨论】:

    • 它不工作@DarkDust。仅第一个输入请求需要两个新行。
    • 首先,您在编辑中声明您使用了echo "\n \n":这不起作用,您缺少-e 选项。接下来,ssh-keygen 是特殊的。出于安全考虑,密码不是从标准输入读取,而是直接从终端读取!要提供密码(即使是空的),您需要使用 -P 选项:echo | ssh-keygen -P ''(注意两个 ' 之间没有空格:它们很重要!)
    • 我只尝试了 -ne 选项,我在这里错过了它(我现在添加了它)。 “ssh-keygen -P ''” 解决了我的问题。非常感谢。所以在这里,由于我使用的命令,它成为一个问题,而不是因为我提供输入的方式。您可以在答案中添加相同的内容,以便我可以选择它作为答案。
    • 这个 ssh-keygen 技巧正是我想要的。谢谢!
    【解决方案2】:

    一般的解决方法是使用the yes command:

    yes '' | command
    

    yes 将重复输出命令行上指定的字符串,并附加换行符。如果您使用空字符串作为参数运行它,它将输出无穷无尽的换行符字符串。

    【讨论】:

      【解决方案3】:

      一个有 2 个空行的 heredoc 怎么样:

      command <<END
      
      
      END
      

      或使用 printf

      printf "\n\n" | command
      

      【讨论】:

        【解决方案4】:

        你应该看看expect:

        #!/usr/bin/expect
        #set timeout 10
        set clientName [lindex $argv 0];
        set hostName [lindex $argv 1];
        set passWord [lindex $argv 2];
        
        spawn ssh "$hostName";
        expect "Password:";
        send "$passWord\r";
        expect "$hostName";
        

        【讨论】:

          【解决方案5】:

          echo -e "\n\n\n\n\n" 这样的解决方案将仅通过回显空行来模拟ENTER,而没有shell prompt

          将会看到:

          ➜  ~ echo -e "\n\n\n\n\n"
          
          
          
          
          
          
          ➜  ~ 
          

          但是如果你想用shell prompt模拟ENTER,这是我的解决方案(定义一个名为entern的函数):

          zsh:

          entern () {
                if [ "$1" ]; then
                  for i in $(seq $1); do echo "${(%%)PS1}"; done
                else
                  for i in $(seq 10); do echo "${(%%)PS1}"; done
                fi
          }
          

          Bash 4.4+:

          entern () {
                if [ "$1" ]; then
                  for i in $(seq 1 $1); do echo "${PS1@P}"; done
                else
                  for i in $(seq 1 10); do echo "${PS1@P}"; done
                fi
          }
          

          见:How to print current bash prompt?

          用途:

          ➜  ~ entern 5
          

          将会看到:

          ➜  ~ entern 5 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          

          默认10次:

          ➜  ~ entern 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          ➜  ~ 
          

          【讨论】:

            猜你喜欢
            • 2015-05-11
            • 1970-01-01
            • 1970-01-01
            • 2020-09-23
            • 1970-01-01
            • 1970-01-01
            • 2012-06-26
            • 2016-12-08
            • 2014-04-18
            相关资源
            最近更新 更多