ssh usr@ip ’cat aa.text‘>>aa.log用法遇到问题集锦
- 一、ssh usr@ip ’cat aa.text‘是进入到目标服务器还是在自己的服务器执行?
- 二、ssh usr@ip ’cat aa.text‘ >>aa.log 是把日志生成到目标服务器还是在自己的服务器里?
- 三、ssh usr@ip <<'EOF' cat aa.text>> aa.log EOF是把日志生成到目标服务器还是在自己的服务器里?
- 四、<<'EOF' EOF 是干嘛的?
-
-
- 有什么区别?
- 具体流程
- 示例
-
- 五、<<'EOF' EOF 为什么带上它就是在目标服务器上执行的,不带就是在自己服务器上执行的?
-
- 1. 将命令(含重定向)包在 heredoc 里传给 `ssh`
- 2. 在本地 Shell 中写重定向
-
- 为什么会出现这种现象?
- 小结
一、ssh usr@ip ’cat aa.text‘是进入到目标服务器还是在自己的服务器执行?
当您执行 ssh usr@ip 'cat aa.text' 这条命令时,cat aa.text 实际是在 远程服务器(usr@ip)上执行的,不是在本机执行。简单来说,您通过 SSH 登录到目标服务器,然后在该服务器上运行指定的命令。
二、ssh usr@ip ’cat aa.text‘ >>aa.log 是把日志生成到目标服务器还是在自己的服务器里?
当执行
ssh usr@ip 'cat aa.text' >> aa.log
时,cat aa.text 是在远程服务器(usr@ip)上执行的,但将其输出重定向写入 aa.log 的操作是由本地 Shell 完成,因此 日志文件生成并保存在本地机器。
换言之:
- 远程服务器:只负责执行 cat aa.text 命令并输出结果。
- 本地:将 SSH 传回的标准输出重定向到 aa.log 文件里。
三、ssh usr@ip <<‘EOF’ cat aa.text>> aa.log EOF是把日志生成到目标服务器还是在自己的服务器里?
在这种写法里:
ssh usr@ip <<'EOF'
cat aa.text >> aa.log
EOF
重定向(>> aa.log)是在远程服务器上执行的。由于整段命令(包括 cat aa.text >> aa.log)都写在 heredoc 当中,会被远端的 Shell 解释并执行,所以生成或追加日志的 aa.log 文件会出现在远程服务器。
如果希望将输出保存到本地,需要把重定向符号放在本地 Shell。例如:
ssh usr@ip "cat aa.text" >> aa.log
此时 cat aa.text 在远程执行,但输出流重定向由本地 Shell 处理,生成的 aa.log 则会在本地主机上。
四、<<‘EOF’ EOF 是干嘛的?
在 Shell 脚本或命令行里,
<<'EOF'
…这里是内容…
EOF
是一种 Heredoc(Here Document)的写法。其作用是将 EOF(或者你指定的结束符号)之间的多行文本,当作标准输入 传给前面所接的命令。
通常我们见到的写法会是:
command <<EOF
这里是输入…
EOF
或者
command <<'EOF'
这里是输入…
EOF
有什么区别?
- 不带引号的 EOF:在这种写法中,变量、命令替换等会被展开。例如 $HOME 会被解析成当前用户主目录路径。
- 带引号的 ‘EOF’:内容将被作为纯文本对待,不会做变量或命令替换。
具体流程
示例
例如
ssh user@host <<'EOF'
cat /etc/passwd
echo $HOME
EOF
- cat /etc/passwd 和 echo $HOME 都运行在远程服务器上,且因为 ‘EOF’ 不做替换,远程服务器上看到的命令字面上就是 cat /etc/passwd 和 echo $HOME。如果没有单引号写 EOF,那些 $HOME 之类的变量可能在本地就被替换了。
五、<<‘EOF’ EOF 为什么带上它就是在目标服务器上执行的,不带就是在自己服务器上执行的?
这里其实并不是因为带了 <<'EOF' 就一定是「在目标服务器上执行」,而是 命令写法 决定了谁来解释和执行重定向。通常有两种常见的场景:
1. 将命令(含重定向)包在 heredoc 里传给 ssh
ssh user@host <<'EOF'
cat /some/path >> remote.log
EOF
- 这段命令连同重定向符 >> remote.log 一起,都作为标准输入传给 远程服务器上的 Shell。
- 所以 cat /some/path >> remote.log 的重定向是在远程Shell解释并执行,日志文件就写在远程服务器上。
2. 在本地 Shell 中写重定向
ssh user@host "cat /some/path" >> local.log
- 这里 ssh user@host "cat /some/path" 是远程执行 cat /some/path,
- 但 >> local.log 是 本地 Shell 看到的,所以日志输出保存到本地。
为什么会出现这种现象?
- Shell 解析规则: 当你在本地用 ssh user@host "some command" 时,大部分转义/重定向符号(如 >> local.log)会被本地 Shell 先处理或保留;只有 "some command" 这部分才会送到远程执行。
- heredoc 的作用: ssh user@host <<'EOF' 意味着后续所有文本都作为输入给 ssh 命令;远程 Shell 会收到整段脚本,包含 >> remote.log 等符号,也就意味着远程 Shell负责执行这些重定向。
- 带不带 '(单引号) 的差别:
- <<EOF(不带引号)时,本地会对中间部分做变量替换;
- <<'EOF'(带引号)时,则把中间的内容当纯文本,不做替换。
但无论有没有 ',只要是把 重定向写在 heredoc 脚本里,就是让远端来执行;只要是把重定向写在 ssh user@host "…" 外面,就是在本地来执行。
小结
- 关键在于:命令和重定向是在谁的 Shell 环境中被解释。
- Heredoc 写法时,整段脚本(含重定向)会送到远端Shell,所以日志会在目标服务器上。
- 如果重定向符写在 ssh user@host … >> localfile,那么重定向就是在本地Shell。
评论前必须登录!
注册