【问题标题】:Access and append local file from remote host in bash script在 bash 脚本中从远程主机访问和附加本地文件
【发布时间】:2021-03-06 00:13:30
【问题描述】:

从我的 bash 脚本中,通过 ssh 登录到远程主机。将我的配置文件与脚本一起发送到远程主机以访问变量。代码如下:

#!/bin/bash

source ~/shell/config.sh
script=$(cat <<\____HERE

   pubkeyarray=()
   privkeyarray=()
   for (( w=1; w<=3; w++))
   do
        cleos create key --file key[$w].txt
        privatekey=$(sed -ne 's/^Private key: \([^ ]*\).*/\1/p' ~/key[$w].txt)
        pubkey=$(sed -ne 's/^Public key: \([^ ]*\).*/\1/p' ~/key[$w].txt)
        pubkeyarray+=("$pubkey")
        privkeyarray+=("$privatekey")
   done
   echo "genesis_public_key=${pubkeyarray[0]}" >>config.sh
   echo "genesis_private_key=${privkeyarray[0]}" >>config.sh

____HERE
)

SCRIPT="$(cat ~/shell/config.sh) ; $script;"
for i in ${!genesishost[*]} ; do
        SCR=${SCRIPT/PASSWORD/${password}}
        sshpass -p ${password} ssh -l ${username} ${genesishost[i]} "${SCR}"
done

genesishostpasswordusername 位于 config.sh 文件中。做一些 EOSIO 操作。

我需要什么:

从远程主机,我想在配置文件中附加"genesis_public_key""genesis_private_key",它们位于我正在执行ssh 的本地计算机上。

此代码在远程生成一个新的配置文件并将这些行附加到那里。我需要 ssh 我的本地机器吗?如果是,则本地机器不能总是相同地添加其 ssh 凭据。我怎样才能完成这项任务?请指导。

【问题讨论】:

  • 这完全没有意义。而是将genesis_public_key="ABC"genesis_private_key="XYZ" 放入您在本地执行的命令中,或者在您source 之前将echos 本地添加到config.sh
  • 我在远程做一些操作,从远程获取ABCXYZ的值。
  • 您似乎有一长串问题,这些问题都围绕着似乎本质上是XY problem. 如果您要执行的命令在所有主机上都相同,那么迄今为止最简单的解决方案是只需将静态命令序列传递给ssh
  • 然后向我们展示一些更真实的东西,而不是 ABC 和 XYZ。仍然没有合理的理由将这些值附加到文件中,而不仅仅是执行它们。
  • 编辑了代码。请检查。

标签: bash shell file ssh remote-server


【解决方案1】:

脚本显然只能访问远程服务器上的文件,而不是让它写入(不存在的)文件,只需让它写出你想要添加到本地文件的输出,然后让调用者做追加。

#!/bin/bash

source ~/shell/config.sh
script=$(cat <<\____HERE

   pubkeyarray=()
   privkeyarray=()
   for (( w=1; w<=3; w++))
   do
        # ... whatever ...
   done
   echo "genesis_public_key=${pubkeyarray[0]}"    # no redirect
   echo "genesis_private_key=${privkeyarray[0]}"  # no redirect

____HERE
)

SCRIPT="$(cat ~/shell/config.sh) ; $script;"
for i in ${!genesishost[*]} ; do
        SCR=${SCRIPT/PASSWORD/${password}}
        sshpass -p ${password} ssh -l ${username} ${genesishost[i]} "${SCR}"
done >>config.sh

显然,如果多个远程主机打印出同名变量的赋值,config.sh 中的最后一个赋值将替换所有之前的赋值。

【讨论】:

  • 好的,谢谢!如果在$script 中,我只想在控制台上回显一些消息,但不希望它们出现在config.sh 中。我们可以避免在配置中附加一些echo 吗?因为这样,无论我在$script 中打印什么,所有内容都会附加到配置中。
  • 始终使用标准错误作为诊断消息; echo "$0: the end is nigh" &gt;&amp;2
  • 您能否建议,如果我想从此代码修改config.sh,就像替换变量值一样。我如何在这里使用sed
  • 我不明白你为什么要使用sed 做任何事情。您的意思是该文件已经包含一个作业并且您想替换它吗?在询问之前搜索重复项,如果您仍然无法弄清楚,请提出一个新问题。 stackoverflow.com/questions/20568515/…
猜你喜欢
  • 2012-07-07
  • 2018-01-29
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多