You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过SSH在BASH中获取远程文件夹文件数组的问题

问题

尝试通过BASH结合SSH获取远程文件夹下的所有文件名并存储到数组中,代码如下:

declare -a existing_files=$(ssh -q -i $SSH_KEY_PATH -t $PROXY_SERVER 
ssh -q -i ubuntu_vm $REMOTE_SERVER "ls $RAW_EEG_FOLDER")

直接在终端执行ssh -q -i $SSH_KEY_PATH -t $PROXY_SERVER ssh -q -i ubuntu_vm $REMOTE_SERVER "ls $RAW_EEG_FOLDER"能正常返回所有文件名,但将结果赋值给数组变量后,却只得到最后一个文件名,问题出在哪?

更新:尝试新代码后报错

根据建议更新代码后:

#!/bin/bash

echo $(bash --version)

source 'secrets/secrets.env'
declare -a existing_files;
readarray -t -d '' existing_files < <(
    ssh -q -i $SSH_KEY_PATH -t $PROXY_SERVER ssh -q -i ubuntu_vm $REMOTE_SERVER  "$( 
        printf '%q ' find "$RAW_EEG_FOLDER" -mindpeth 1 -maxdepth 1 \
            '(' -type d -printf '%f/\0' ')' -o -printf '%f\0'
    )"
)
echo ${existing_files}

执行后出现错误:

GNU bash, version 5.2.15(1)-release (aarch64-apple-darwin22.1.0)
Copyright (C) 2022 Free Software Foundation, Inc. License GPLv3+:
GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This
is free software; you are free to change and redistribute it. There
is NO WARRANTY, to the extent permitted by law.

# 关键错误信息:
bash: -c: line 0: `find /home/.../ -mindpeth 1 -maxdepth 1 
( -type d -printf %f/\0 ) -o -printf %f\0'

问题分析与解决方案

1. 原问题:数组仅保留最后一个元素的原因

你采用的declare -a existing_files=$(...)赋值方式存在两个核心问题:

  • 数组赋值逻辑错误:$(...)会将命令输出展开为单个字符串,bash会按默认IFS(空格、换行、制表符)分割字符串生成数组元素。但ssh的-t参数会强制分配伪终端,可能导致输出格式异常(比如换行被转换为回车换行),最终导致元素分割错误,甚至仅保留最后一个元素。
  • ls输出不适合程序解析:如果文件名包含空格、换行等特殊字符,ls的输出会直接导致解析失败——它仅用于人类阅读,不适合脚本处理。

2. 更新代码后的报错原因

错误出在find参数拼写:-mindpeth应为-mindepth(少了一个字母e),导致find无法识别参数而报错。

3. 修正后的最终代码

#!/bin/bash

echo "$(bash --version)"

source 'secrets/secrets.env'

declare -a existing_files
readarray -t -d '' existing_files < <(
    ssh -q -i "$SSH_KEY_PATH" "$PROXY_SERVER" \
        ssh -q -i ubuntu_vm "$REMOTE_SERVER" \
        "$(printf '%q ' find "$RAW_EEG_FOLDER" -mindepth 1 -maxdepth 1 \
            '(' -type d -printf '%f/\0' ')' -o -printf '%f\0')"
)

# 遍历数组打印所有元素,验证结果
for file in "${existing_files[@]}"; do
    echo "$file"
done

关键修正说明

  • 移除ssh的-t参数:无需伪终端,避免干扰输出格式导致空分隔符失效。
  • 修正find参数拼写错误:将-mindpeth改为-mindepth。
  • 变量添加双引号:比如"$SSH_KEY_PATH",避免变量含特殊字符时出现解析错误。
  • 改用for循环打印数组:直接echo ${existing_files}仅会输出数组第一个元素,循环遍历才能完整展示所有结果。

内容的提问来源于stack exchange,提问作者Fabio Magarelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:41:29