执行远程命令需用双引号包裹整个命令串,避免本地解析;多命令用&&而非;;含引号时改用单引号或转义;变量需单引号防本地展开;交互命令必须加-t分配tty;长命令推荐heredoc。

直接执行远程命令时,不加引号或引号位置错误,ls 会在本地运行;没配好免密登录,脚本会卡在密码输入;用 ssh user@host command 形式却忘了加 -t,遇到需要交互的命令(比如 sudo、vim)直接退出。
双引号包裹命令字符串是硬性要求
shell 在本地解析命令行,空格和分号都会被提前拆解。不加双引号,ssh user@host cd /home ; ls 中的 ; 就成了本地 shell 的命令分隔符,ls 根本不会传到远端。
- 正确写法:
ssh user@host "cd /home && ls -l"(注意整个命令串用双引号包住) - 多个命令建议用
&&而非;,避免前一步失败后仍执行后续命令 - 如果命令里本身含双引号,外层改用单引号,或对内部引号转义:
ssh user@host 'echo "hello world"' - 变量在本地展开,远端不可见;如需远端使用变量,得写成
'echo $PATH'(单引号防本地替换)
需要交互时必须加 -t
默认 ssh 不分配伪终端(tty),导致 sudo 拒绝提权、vim 报错 OOPS、top 直接退出——这些都不是命令本身的问题,而是缺少 tty 环境。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 加
-t强制分配:ssh -t user@host "sudo systemctl restart nginx" - 连续两次
-t(即-tt)可绕过某些服务器的RequireTTY yes限制 - 但
-t会强制开启交互模式,若用于脚本且不希望等待用户输入,得配合timeout或检查远端sudoers是否配置了NOPASSWD
长命令或脚本推荐用 ssh + heredoc
比拼接一长串带引号的字符串更清晰,也避免引号嵌套和转义混乱,尤其适合多行命令或条件逻辑。
- 基本结构:
ssh user@host bash (注意 <code> 中的单引号,防止本地变量展开) - 示例:
ssh user@host bash
- 远端执行环境是干净的非交互式 shell,
~/.bashrc不自动加载;如需 alias 或自定义 PATH,开头显式 source:source ~/.bashrc
免密登录是自动化前提,但别忽略权限细节
公钥复制过去后仍提示密码,90% 是因为 ~/.ssh/authorized_keys 权限不对,或者服务端 sshd_config 关闭了公钥认证。
- 客户端生成密钥:
ssh-keygen -t ed25519(比 rsa 更快更安全) - 服务端关键权限:
chmod 700 ~/.ssh,chmod 600 ~/.ssh/authorized_keys - 检查服务端配置:
grep -E "PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config,确认值为yes和.ssh/authorized_keys - 重启服务后测试连接是否真免密:
ssh -o BatchMode=yes user@host true,返回 0 才算成功
最常被跳过的其实是远端 shell 环境差异:脚本里写的 source ~/.bashrc 在非登录 shell 下可能无效,$PATH 也不含 /usr/local/bin;临时方案是显式写全路径,长期应统一用 /etc/environment 或修改 /etc/passwd 中的 shell 类型。










