通过 Linux bash 读取远程文件并使用远程机器本身的内容

Read a remote file and use the contents on remote machine itself via Linux bash

我有以下 bash 脚本,它登录到远程机器并在那里创建一个文件,但是当我尝试逐行读取该文件时,它没有给我任何输出,尽管 cat 工作得很好。 以下是我一直在做的示例:

ssh $USER@$HOST bash -c "'

echo "Preparing list of files to be transferred...."

rm -rf /tmp/file_to_read.txt

# Creating a new file in following line

rsync -vunr $DIR $USER@$DESTINATION:$DIR | grep ".zip" > tmp/file_to_read.txt

#Following line gives me correct output

cat /tmp/file_to_read.txt

# But the variable FILENAME in following line has no value 

while read -r FILENAME; do

    echo "Copying $FILENAME" # <-- PROBLEM HERE

done < "/tmp/file_to_read.txt" '" 

有什么建议吗?如果需要更多信息,请告诉我。

输出如下:

line1
line2
line3
Copying
Copying
Copying

预期输出为:

line1
line2
line3
Copying line1
Copying line2
Copying line3

首先,你的最后一行似乎有一些错误:

done < "/tmp/bundles_to_sync.txt" '" echo "Bye from $HOST"

替换为:

done < "/tmp/bundles_to_sync.txt"
echo "Bye from $HOST"

而且我认为您应该删除 tmp 之前的“/”以在您的代码中访问与上面相同的文件:

done < "tmp/bundles_to_sync.txt"
echo "Bye from $HOST"

您在 shell 脚本中遇到变量求值问题。

注意引用命令的方式将使变量在本地计算机或远程计算机上计算。

例如,以下内容使您的 local shell 替换变量 FILENAME,before 执行 ssh。只需致电 "bash -c ..." 即可了解这一点。

ssh $USER@$HOST bash -c "'
# ...
    echo "Copying $FILENAME"
'"

有很多解决方案,可以通过更改引号(以失去脚本的 "input" 变量替换为代价),或者转义以防止被本地 shell.[=12 替换=]

ssh $USER@$HOST bash -c "'
# ...
    echo "Copying $FILENAME"
'"