我有两台机器,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
上面的命令。
头脑:
您必须使某种公钥身份验证正常工作,以便 inner
ssh
命令无需任何进一步的用户输入即可工作。否则,由于 innerssh
和 outerscp
,您将被提示输入两次密码。你应该确保内部
ssh
命令只打印出变量$FOO
。在外部命令中使用它之前,请先自行尝试一下,scp
并确保它有效。由于某些我不完全理解的原因,当我测试上面写的命令时,它无法按预期工作,因为获取的变量将包含一些奇怪的控制前缀。例如,当我尝试将某些内容复制到远程时
$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_FOO
host1 上的变量中。以下脚本将执行此操作:
#!/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"