首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expect / Bash:在expect中运行bash if语句

Expect / Bash:在expect中运行bash if语句
EN

Stack Overflow用户
提问于 2013-04-03 08:23:27
回答 3查看 1.5K关注 0票数 0

我正在尝试ssh到服务器,并检查id_rsa.pub是否存在。如果它不存在,我想运行ssh-keygen,否则我什么也不想做。

我可以在Tcl/Expect中使用send简单地运行像"cat“或"rm”这样的命令,但当我尝试这样做时,它不起作用:

代码语言:javascript
复制
send "if [ ! -f $USER_SSH_PATH/id_rsa.pub ]; then CREATE_FILE=true; fi\r"
expect "# " { }

send "if $CREATE_FILE; then; ssh-keygen -t rsa -C $USER -f $USER_SSH_PATH/id_rsa\r"
...

我收到以下错误消息:# invalid command name "!“在执行从内部调用的"!-f /root/.ssh/id_rsa.pub“时

可以运行这样的命令吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-03 14:55:44

您需要对方括号进行转义,因为它是tcl语法的一部分:

代码语言:javascript
复制
send "if \[ ! -f $USER_SSH_PATH/id_rsa.pub \]; then CREATE_FILE=true; fi\r"

在tcl中,[]的工作方式与``$()的工作方式相同。因此,在执行send命令之前,解释器首先对字符串进行替换,然后发现需要替换的两件事:

用变量USER_SSH_PATH

  • !中包含的值替换
  1. $USER_SSH_PATH ...被替换为调用!函数/命令的结果。正如你所发现的,它并不存在。

请注意,在tcl (以及extension expect)中,变量和函数名并不限于字母数字。可以使用变量和函数名,如$!,甚至NUL字符(值为0的字节):

代码语言:javascript
复制
proc ! {} {puts "!"}
proc "$" {} {puts "\$"}
proc \0 {} {puts "NUL character"}

!   ;# this prints !
\$  ;# this prints $
\0  ;# this prints "NUL character"

有关tcl语法的更多信息,请参见http://www.tcl.tk/man/tcl/TclCmd/Tcl.htm

票数 4
EN

Stack Overflow用户

发布于 2013-04-03 08:55:06

你的$USER_SSH_PATH里有什么?在您的本地和远程机器上是否相同,这意味着您拥有正确的权限...以下内容可能会帮助您进行调试。

代码语言:javascript
复制
echo ${USER_SSH_PATH}
ssh <hostname> "
if [ ! -f ${USER_SSH_PATH}/id_rsa.pub ]; then
   echo ${USER_SSH_PATH};
   echo \"File Not Found, Creating....\";
   ssh-key-gen -t rsa -C ${USER} -f ${USER_SSH_PATH}/id_rsa;
else
   echo \"File Found\";
   exit 1;
fi
"
票数 0
EN

Stack Overflow用户

发布于 2013-04-03 10:00:41

我刚刚想到的一种解决方案是在发送命令中运行"ls /root/.ssh/ | grep id_rsa.pub“,并使用expect查看输出。我很好奇我是如何运行bash if命令的。

要么返回"id_rsa.pub“,要么返回空行。但是如果我有"id_rsa.pub*“,它就会坏掉。

有没有人有办法改进这一点?谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15776844

复制
相关文章

相似问题

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