【问题标题】:Declare variable on unix server在 unix 服务器上声明变量
【发布时间】:2016-07-20 23:06:27
【问题描述】:

我正在尝试登录其中一台远程服务器 (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 

但我没有在本地机器上获得“server_node1”和“server_node2”的值。

任何帮助将不胜感激。

【问题讨论】:

  • 您在[[ ! -f ]] 中有/home/rakesh,但在cat 中有/home/rt9419。您真的是在检查一个文件是否存在,然后故意检索另一个文件,还是其中一个错误?
  • 哎呀我的坏!纠正事情。谢谢

标签: bash shell unix ssh scripting


【解决方案1】:

你应该从box1box2取回文件并带有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`

【讨论】:

  • 我不认为日志文件是可执行的 ;-) 。另外,OP 发帖人想将日志文件的 content 存储到变量中(这很奇怪,但让我们希望他知道他在这里做什么)。
  • 抱歉,我遇到了复制/粘贴问题并添加了缺少的cats
【解决方案2】:

有几种可能性。在您的情况下,您可以在远程系统上创建一个文件(以 bash 语法),其中包含这些变量的分配,例如

echo "export server_node2='$(</home/rt9419/tomar.log)'" >>export_settings

(这让我想知道为什么您希望将日志文件的全部内容存储到一个变量中,但这是另一个问题),然后将此文件传输到您的主机(例如使用 scp)并从您的 bash 中获取它脚本。

【讨论】:

  • 那为什么不直接复制日志文件,然后从那里获取呢?如果日志文件在任何地方都包含一个单引号,这会因此而中断,否则,看起来也很脆弱。
【解决方案3】:

就像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 的错误代码,并且标准错误上的错误消息将在您的标准错误上可见,因此@ 987654330@ 似乎是多余的。 (如果您想要自定义消息,variable=$(ssh whatever) || echo "Custom message" &gt;&amp;2 会这样做。注意重定向到标准错误;在这里似乎无关紧要,但这是一种很好的形式。)
  • 如果你真的想,你可以在ssh中运行任意复杂的命令;如上所述,这里似乎没有必要,但您可以使用assigment=$(ssh remote 'if [[ things ]]; then for variable in $(complex commands to drive a loop); do : etc etc; done; fi; more &lt;/dev/null; exit "$variable"') 或其他方式。

随着您最初尝试的进一步深入,

  • 在您的尝试中,here 文档中的反引号将由您的 local shell 在 ssh 命令运行之前进行评估。关于如何解决这个问题有单独的问题;参见例如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 进程架构的设计,这仍然只使它们对孩子可见。

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 2016-10-09
    • 2018-04-16
    • 1970-01-01
    • 2016-06-06
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多