如何使用 scp 使用远程主机的环境变量?

如何使用 scp 使用远程主机的环境变量?

我有两台机器,host1 和 host2。

我想从 host1 的 scp 命令中使用 host2 的环境变量。例如,从 host1 使用此类命令:

scp file host2@host2_adress:$FOO

其中 $FOO 在 host2 中定义为目录的路径。如果我使用上面的命令,bash 将在 host1 而不是 host2 的变量中搜索。

一个实际的例子是使用 host2 的 $HOME 变量

怎么做 ?

答案1

您可以尝试这样的操作:

scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO')

为了解析变量的值$(ssh host2@host2_address 'printf $FOO'),shell 将在内部执行命令ssh host2@host2_address 'printf $FOO',并将此命令打印的内容作为变量的值,然后将其替换到外部scp命令中。当然,很明显你必须拿来host2 中的变量$FOO,因为 host1 根本不知道它。获取它的一种方法是使用ssh上面的命令。

头脑:

  1. 您必须使某种公钥身份验证正常工作,以便 innerssh命令无需任何进一步的用户输入即可工作。否则,由于 innerssh和 outer scp,您将被提示输入两次密码。

  2. 你应该确保内部ssh命令只打印出变量$FOO。在外部命令中使用它之前,请先自行尝试一下,scp并确保它有效。

  3. 由于某些我不完全理解的原因,当我测试上面写的命令时,它无法按预期工作,因为获取的变量将包含一些奇怪的控制前缀。例如,当我尝试将某些内容复制到远程时$HOME,它会尝试将其复制到\033k$HOME\033\\/home/user而不是简单地/home/user复制到。我不得不使用以下命令使其工作:

    scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO' | cut -d\\ -f2)
    

    ...当然,就我的具体情况而言$FOO$HOME

这是我想出的一个快速(因为它相当短)和动态(因为它会即时获取变量)的解决方案。但是,特别是因为最后一点,我认为更可靠的方法是使用一个脚本,通过首先将远程变量打印到文件中来获取它们。更准确地说,host1 上的脚本将连接到 host2,远程将输出打印printenv到 host2 上的某个文件,从 host2 获取该文件,解析它,然后将值导出到本地环境变量。例如,host2 上的变量$FOO可以放入$HOST2_FOOhost1 上的变量中。以下脚本将执行此操作:

#!/bin/bash

ssh host2@host2_address  'printenv > host2_vars.txt'
scp host2@host2_address:host2_vars.txt .
#ssh host2@host2_address  'rm host2_vars.txt' #if you like to clean up
eval $(cat host2_vars.txt | perl -pe 's/^(.*)=(.*)$/export HOST2_$1="$2"/g')

当然,你必须执行该脚本命令scp

答案2

我建议逃离美元

scp file host2@host2_adress:"\$FOO"

相关内容