首页 新闻 会员 周边 捐助

Shell 的本地参数分割 + SSH 的空格拼接,会导致命令结构被破坏。

0
[待解决问题]

ssh user@host arg1 arg2 arg3 ...

SSH 客户端会:
1. 把 arg1 arg2 arg3 ... 用单个空格连接 成一个字符串
2. 将这个字符串作为 要执行的 shell 命令 发送给远程服务器
3. 远程服务器用 $SHELL -c "拼接后的命令" 执行

多个参数 → 拼接执行

ssh localhost echo hello world

● 本地 token: echo , hello , world (3 个)
● 远程实际执行: echo hello world
● 输出: hello world

 

用引号控制分组

ssh localhost 'echo "hello world"'

● 本地 token: 'echo "hello world"' (1 个)
● 远程执行: echo "hello world"
● 输出: hello world

 

错误拆分导致命令断裂

你想远程执行:

bash -c 'date +%F'

但错误写成:

ssh host bash -c 'date +%F'

● 本地 token: bash , -c , 'date +%F' (3 个)
● SSH 拼接为: bash -c date +%F
● 远程执行: bash -c date +%F

● bash -c 只取第一个参数 date 作为命令
● +%F 被当作 $0 (脚本名),被忽略
● 结果:输出完整日期,而非 2025-12-30

就是“多个参数导致语义错误”的典型!

正确写法(确保  bash -c  的命令是一个整体)

ssh host 'bash -c "date +%F"'
# ↑ 整个命令是一个 token ↑

ssh host "bash -c 'date +%F'"

→ 远程收到一个参数: bash -c 'date +%F' 
→ shell 解析后正确执行格式化日期。

 

如果你希望远程执行的命令中,某些部分(如  date +%F )不被进一步分割,就必须让它们在本地就是一个 token(用引号包裹)。

*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1306
提问于:2025-12-30 23:34
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册