[编辑]它可以被认为是对[这个问题] [1]的扩展。 echo | command
echo | command
以上命令可用于向命令的第一个input请求提供一个“ENTER”字符。
如何在第二个input请求中提供下一个“回车”字符到同一命令。
如果需要其他细节,请发表评论。
我给出了具体的例子,我想实现。 我需要在shell脚本中运行SSH-keyGen
。 它会要求以下input:
我们如何将这三个input传递给命令?
我试过了,
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
注意:为避免上述两个命令中的input文件名请求,只是为了简单起见
例如,你也可以使用
echo -e "\n"
要么
echo -en "\n\n"
-e
选项告诉echo
来解释转义字符。 \n
是换行符(输入)字符。 所以第一个打印换行是因为\n
,然后是另外一个,因为echo
通常附加一个换行符。
-n
选项告诉echo
禁止添加隐式换行符。 为了得到两个换行符,你需要指定两个\n
。
编辑:
这里的问题是, ssh-keygen
是特殊的。 由于安全考虑,密码不是从标准输入读取,而是直接从终端读取! 要提供密码(即使是空密码),您也需要使用-P
选项。 既然你只需要一个ENTER(对于文件路径提示),这个命令应该可以工作:
echo | ssh-keygen -P ''
(注意两者之间没有空间:它们很重要!)
如何与2空行heredoc:
command <<END END
或者使用printf
printf "\n\n" | command
一般的解决方法是使用yes
命令 :
yes '' | command
yes
会重复输出在命令行中指定的字符串,并附加一个换行符。 如果你用一个空字符串作为参数运行它,它会输出一个无穷无尽的换行符串。
你应该看看期待:
#!/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";