我正在尝试登录其中一个远程服务器(Box1)并尝试读取远程服务器上的一个文件(Box1)。 这包含另一个服务器(Box2)的详细信息,基于该细节我必须回到本地服务器并ssh到另一个服务器(Box2)进行一些数据处理。等等......
ssh box1.com << EOF
if [[ ! -f /home/rakesh/tomar.log ]]
then
echo "LOG file not found"
else
echo " LOG file present"
export server_node1= `cat /home/rakesh/tomar.log`
fi
EOF
ssh box2.com << EOF
if [[ ! -f /home/rakesh/tomar.log ]]
then
echo "LOG file not found"
else
echo " LOG file present"
export server_node2= `cat /home/rakesh/tomar.log`
fi
EOF
但我没有得到&#34; server_node1&#34;和&#34; server_node2&#34;在本地机器上。
任何帮助将不胜感激。
答案 0 :(得分:1)
就像bash -c 'export foo=bar'
无法在您键入的调用shell中声明变量一样,ssh
命令无法在调用shell中声明变量。您将不得不重构,以便调用shell接收信息并知道如何处理它。
我同意这样的评论:将日志文件存储在变量中可能不是一个理智的,或者至少是优雅的事情,但是做你正在尝试的事情的简单方法是放置ssh
在任务内部。
server_node1=$(ssh box1.com cat tomar.log)
server_node2=$(ssh box2.com cat tomar.log)
一些注释和扩充:
/home/rt9419
您的主目录,显然)。cat
命令出错,ssh
的退出代码将是来自cat
的错误代码,并且您的标准错误上会显示错误消息标准错误,所以echo
似乎是多余的。 (如果你想要一个自定义消息,variable=$(ssh whatever) || echo "Custom message" >&2
会这样做。请注意重定向到标准错误;这似乎并不重要,但它是好的形式。)ssh
中运行任意复杂的命令;如上所述,这里似乎没有必要,但你可以做assigment=$(ssh remote 'if [[ things ]]; then for variable in $(complex commands to drive a loop); do : etc etc; done; fi; more </dev/null; exit "$variable"')
或其他什么。作为对原始尝试的进一步评论,
ssh
命令运行之前,您的本地 shell将对您尝试的此处文档中的反引号进行评估。有关如何解决这个问题的单独问题;见例如How have both local and remote variable inside an SSH command.但简而言之,除非您绝对要求本地shell能够修改您发送的命令,否则可能会将它们放在单引号中,就像我在上面的愚蠢复杂ssh
示例中所做的那样。export
的功能是使变量对子进程可见。没有办法影响父进程的环境(没有办法让它合作和/或协调更改,如上面的代码所示)。作为说明差异的示例,如果将PERL5LIB
设置为具有Perl库的目录,但未能export
,则启动的Perl进程将看不到该变量;它只对当前shell可见。当你export
时,你作为这个shell的子进程启动的任何Perl进程也会看到这个变量和你赋值的值。换句话说,你export
变量不是当前shell的私有(并且不是export
私有的;除了确保它们是私有的,这节省了需要的内存量通过U * x流程架构的设计,但仍然只能让孩子看到它们在流程之间复制。答案 1 :(得分:0)
您应该使用box1
从box2
和scp
取回文件:
scp box1.com:/home/rt9419/tomar.log ~/tomar1.log
#then you can cat!
export server_node1=`cat ~/tomar1.log`
同意box2
scp box2.com:/home/rt9419/tomar.log ~/tomar2.log
#then you can cat!
export server_node2=`cat ~/tomar2.log`
答案 2 :(得分:-1)
有几种可能性。在您的情况下,您可以在远程系统上创建一个文件(使用bash语法),包含这些变量的赋值,例如
echo "export server_node2='$(</home/rt9419/tomar.log)'" >>export_settings
(这让我想知道为什么你希望将日志文件的全部内容存储到变量中,但这是另一个问题),然后将此文件传输到您的主机(例如使用scp)并从您的bash中获取它脚本。