带 for 的多行 ssh 命令

Multiline ssh command with for

我有一个 bash 脚本通过 ssh.

执行命令
FILENAMES=(
  "export_production_20200604.tgz"
  "export_production_log_20200604.tgz"
  "export_production_session_20200604.tgz"
  "export_production_view_20200604.tgz"
)

sshpass -p $PASSWORD ssh -T $LOGIN@$IP '/bin/bash' <<EOF
  for f in "${FILENAMES[@]}"; do
    echo Untar "$f"
  done
EOF

问题是当我执行脚本时,$f 是空的。

我在网上查看了多个执行多个命令的解决方案,但 none 有效:

link 1

link 2

...

你能帮我解决一下吗?


:

执行:

for f in "${FILENAMES[@]}"; do
    echo Untar "$f"
done

<<EOFEOF之外,作品


在本地:

bash 4.4.20(1)-发布

远程:

bash 4.2.46(2)-发布



编辑:技巧

由于时间紧迫,别无选择,我实施了@hads0m 提供的解决方案,希望它能帮助遇到同样问题的开发人员:

#  the command
function executeRemoteCommand() {
    sshpass -p $DB_PASSWORD ssh $DB_LOGIN@$DB_SERVER_IP 
}

for i in "${!FILENAMES[@]}"; do
    f=$FILENAMES[$i]

    DB_NAME=$DB_NAMES[$i]

    # Untar the file
    executeRemoteCommand '/usr/bin/tar xzvf '$MONGODB_DATA_PATH'/'$TMP_DIRECTORY'/'$f' --strip-components=1'

    # Delete the tar
    executeRemoteCommand 'rm -f '$MONGODB_DATA_PATH'/'$TMP_DIRECTORY'/'$f''

    # Restore the database
    executeRemoteCommand 'mongorestore --host 127.0.0.1:'$DB_PORT' --username "'$MONGODB_USER'" --password "'$MONGODB_PASSWORD'" --authenticationDatabase admin --gzip "'$DB_NAME'" --db "'$DB_NAME'"'
done

尝试 运行 像这样:

for f in "${FILENAMES[@]}"; do
  sshpass -p $PASSWORD ssh -T $LOGIN@$IP echo Untar "$f"
done

此外,不要忘记将 #!/bin/bash 添加到脚本的第一行。

您需要转义 $ 符号以避免它在本地展开并将数组传递给远程。

这可能是您想要的:

#!/usr/bin/env bash

FILENAMES=(
      "export_production_20200604.tgz"
      "export_production_log_20200604.tgz"
      "export_production_session_20200604.tgz"
      "export_production_view_20200604.tgz"
)

sshpass -p $PASSWORD ssh -T $LOGIN@$IP '/bin/bash' <<EOF
  $(declare -p FILENAMES)                                                                       
  for f in "${FILENAMES[@]}"; do                                                               
    echo Untar "$f"                                                                            
  done                                                                                          
EOF