带 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 有效:
...
你能帮我解决一下吗?
注 :
执行:
for f in "${FILENAMES[@]}"; do
echo Untar "$f"
done
在<<EOF
EOF
之外,作品
在本地:
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
我有一个 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 有效:
...
你能帮我解决一下吗?
注 :
执行:
for f in "${FILENAMES[@]}"; do
echo Untar "$f"
done
在<<EOF
EOF
之外,作品
在本地:
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