Linux RHEL 8远程SSH执行cat命令无输出及变量回传问题
SSH远程执行脚本问题解答
问题1:远程执行cat命令无输出的解决方法
你的脚本中cat命令实际已在远程执行,但仅将结果赋值给远程变量FILE_CONTENT,未将内容输出到SSH通道,因此本地终端看不到输出;添加cat "\$FILE" > output.txt后生成空文件,大概率是here-doc的变量解析问题或路径权限问题,以下是正确实现方式:
让本地看到cat输出的写法
修改远程执行部分,直接输出文件内容,或把变量内容echo出来:
#!/bin/bash SERVER=$1 USER=$2 PATH1="/mypath" FILE="myfile" ssh $USER@$SERVER << 'EOF' cd "/mypath" DATE_SUFFIX="$(date +%Y%m%d)" cp "myfile" "myfile_$DATE_SUFFIX" # 直接输出文件内容到本地终端 cat "myfile" # 或赋值后输出变量内容 FILE_CONTENT="$(cat "myfile")" echo "$FILE_CONTENT" EOF
注意:使用
<< 'EOF'替代<< EOF,可避免本地shell解析远程脚本中的变量,确保所有命令完全在远程执行。
远程生成含内容的output.txt的正确写法
若要在远程生成包含文件内容的output.txt,需确保路径正确且权限足够:
ssh $USER@$SERVER << 'EOF' cd "/mypath" cat "myfile" > output.txt EOF
若文件仍为空,检查远程/mypath/myfile是否存在、是否有读取权限,以及output.txt所在目录是否有写入权限。
问题2:将远程变量传回本地的方法
把远程服务器的变量值传回本地,核心思路是让远程输出变量内容,本地通过命令替换捕获该输出:
方法1:捕获远程文件内容到本地变量
#!/bin/bash SERVER=$1 USER=$2 PATH1="/mypath" FILE="myfile" # 捕获远程文件内容到本地变量 FILE_CONTENT=$(ssh $USER@$SERVER << 'EOF' cd "/mypath" cat "myfile" EOF ) # 本地使用变量 echo "$FILE_CONTENT"
方法2:捕获远程自定义变量到本地
比如获取远程的DATE_SUFFIX变量:
#!/bin/bash SERVER=$1 USER=$2 DATE_SUFFIX=$(ssh $USER@$SERVER << 'EOF' DATE_SUFFIX="$(date +%Y%m%d)" # 输出变量值供本地捕获 echo "$DATE_SUFFIX" EOF ) # 本地使用远程传回的变量 echo "$DATE_SUFFIX"
注意事项
- 始终用
<< 'EOF'包裹远程执行的脚本,避免本地shell意外解析远程变量。 - 若远程输出包含特殊字符(如换行、空格),本地捕获时需用双引号包裹变量,防止内容被分割。
内容的提问来源于stack exchange,提问作者user3478415
相关产品推荐
相关产品推荐

