Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过bash脚本将函数从函数调用到远程主机不起作用_Bash_Function_Shell_Remote Host - Fatal编程技术网

通过bash脚本将函数从函数调用到远程主机不起作用

通过bash脚本将函数从函数调用到远程主机不起作用,bash,function,shell,remote-host,Bash,Function,Shell,Remote Host,我正在编写一个bash脚本来登录远程主机并通过它调用多个函数。 从ssh远程脚本调用install_prelibrary并从该脚本调用其他两个函数。 以下是我的脚本: #!/bin/bash source ~/shell/config.sh install_prelibrary () { wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-18.04_amd64.deb --no-

我正在编写一个bash脚本来登录远程主机并通过它调用多个函数。 从ssh远程脚本调用install_prelibrary并从该脚本调用其他两个函数。 以下是我的脚本:

#!/bin/bash

source ~/shell/config.sh

install_prelibrary () {
  wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-18.04_amd64.deb --no-check-certificate > /dev/null 2>&1;
  if [ $? -ne 0 ]; then
                printf "\n\nError downloading Ubuntu Binary file\n\n"
                exit 0;
  else 
                install_cdt
                create_wallet_and_keys
  fi
}

install_cdt(){
   #some commands
}
create_wallet_and_keys(){
   #some commands
}

SCRIPT="$(cat ~/shell/config.sh) ; $(declare -f) ; install_prelibrary"
for i in ${!genesishost[*]} ; do
        printf "\t=========== node ${genesishost[i]} ===========\n\n"
        SCR=${SCRIPT/PASSWORD/${password}}
        sshpass -p ${password} ssh -l ${username} ${genesishost[i]} "${SCR}"
done
config.sh

当我使用bash main.sh运行这个脚本时,首先,create_wallet_和_key被调用。我不知道为什么?因为我没有在任何地方手动调用此函数。然后安装预库,然后安装cdt。从install_prelibrary调用install_cdt是可以的,但create_wallet_和_keys会给出找不到的错误命令。为什么不像其他功能一样在远程主机上调用“创建钱包”和“密钥”? 我希望在远程主机上调用的第一个函数是install_prelibrary,然后从这个函数调用另外两个函数。
请更正。

尝试重新排序您的函数

#!/bin/bash

source ~/shell/config.sh

install_cdt(){
   #some commands
}
create_wallet_and_keys(){
   #some commands
}

install_prelibrary () {
  wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-18.04_amd64.deb --no-check-certificate > /dev/null 2>&1;
  if [ $? -ne 0 ]; then
                printf "\n\nError downloading Ubuntu Binary file\n\n"
                exit 0;
  else 
                install_cdt
                create_wallet_and_keys
  fi
}

SCRIPT="$(cat ~/shell/config.sh) ; $(declare -f) ; install_prelibrary"
for i in ${!genesishost[*]} ; do
        printf "\t=========== node ${genesishost[i]} ===========\n\n"
        SCR=${SCRIPT/PASSWORD/${password}}
        sshpass -p ${password} ssh -l ${username} ${genesishost[i]} "${SCR}"
done

通过这种方式,它们将在函数本身下面被调用。

如果看不到生成的脚本的确切外观,就不可能对此进行故障排除

但是我会将您的逻辑分解为一个脚本,它被复制到目标并在那里执行,以及一个简单的脚本,它执行复制和计算

!/bin/bash 脚本=$cat&1;然后 :通过 其他的 rc=$? 将错误写入标准错误,以实际故障代码退出 下载Ubuntu二进制文件时出现printf错误\n>&2 退出$rc fi 安装cdt 创建\u钱包\u和\u密钥 } 安装cdt{ 一些命令 } 创建\u钱包\u和\u密钥{ 一些命令 } ____这里 SCRIPT=$cat~/shell/config.sh$剧本安装预库 对于${!genesishost[*]}中的i;做 printf\t=============节点${genesishost[i]}================\n\n SCR=${SCRIPT/PASSWORD/$PASSWORD} sshpass-p$password ssh-l$username${genesishost[i]}${SCR} 完成
如果您也需要在本地对函数进行求值,那么让脚本自己读取并不难;或者简单地将代码存储在外部文件和源代码中,并将其读入变量。

这个问题有一长串变体,在每个连接处,您都会被告知这种方法有缺陷。简单而直接的解决方案是将脚本文件复制到远程主机,然后在那里执行它bash-s'<~/shell/build/main.sh$声明-f;安装预库。正在复制文件,但仍会首先执行“创建钱包”和“密钥”。
#!/bin/bash

source ~/shell/config.sh

install_cdt(){
   #some commands
}
create_wallet_and_keys(){
   #some commands
}

install_prelibrary () {
  wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-18.04_amd64.deb --no-check-certificate > /dev/null 2>&1;
  if [ $? -ne 0 ]; then
                printf "\n\nError downloading Ubuntu Binary file\n\n"
                exit 0;
  else 
                install_cdt
                create_wallet_and_keys
  fi
}

SCRIPT="$(cat ~/shell/config.sh) ; $(declare -f) ; install_prelibrary"
for i in ${!genesishost[*]} ; do
        printf "\t=========== node ${genesishost[i]} ===========\n\n"
        SCR=${SCRIPT/PASSWORD/${password}}
        sshpass -p ${password} ssh -l ${username} ${genesishost[i]} "${SCR}"
done