在unix服务器上声明变量

时间:2016-04-01 08:13:08

标签: bash shell unix ssh scripting

我正在尝试登录其中一个远程服务器(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;在本地机器上。

任何帮助将不胜感激。

3 个答案:

答案 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)

一些注释和扩充:

  • 远程shell将在您的主目录中运行,因此我将其取出(假设/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)

您应该使用box1box2scp取回文件:

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中获取它脚本。