我正在尝试ssh到服务器,并检查id_rsa.pub是否存在。如果它不存在,我想运行ssh-keygen,否则我什么也不想做。
我可以在Tcl/Expect中使用send简单地运行像"cat“或"rm”这样的命令,但当我尝试这样做时,它不起作用:
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“时
可以运行这样的命令吗?
发布于 2013-04-03 14:55:44
您需要对方括号进行转义,因为它是tcl语法的一部分:
send "if \[ ! -f $USER_SSH_PATH/id_rsa.pub \]; then CREATE_FILE=true; fi\r"在tcl中,[]的工作方式与``或$()的工作方式相同。因此,在执行send命令之前,解释器首先对字符串进行替换,然后发现需要替换的两件事:
用变量USER_SSH_PATH
!函数/命令的结果。正如你所发现的,它并不存在。请注意,在tcl (以及extension expect)中,变量和函数名并不限于字母数字。可以使用变量和函数名,如$或!,甚至NUL字符(值为0的字节):
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。
发布于 2013-04-03 08:55:06
你的$USER_SSH_PATH里有什么?在您的本地和远程机器上是否相同,这意味着您拥有正确的权限...以下内容可能会帮助您进行调试。
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
"发布于 2013-04-03 10:00:41
我刚刚想到的一种解决方案是在发送命令中运行"ls /root/.ssh/ | grep id_rsa.pub“,并使用expect查看输出。我很好奇我是如何运行bash if命令的。
要么返回"id_rsa.pub“,要么返回空行。但是如果我有"id_rsa.pub*“,它就会坏掉。
有没有人有办法改进这一点?谢谢!
https://stackoverflow.com/questions/15776844
复制相似问题