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(用引号包裹)。