远程SSH执行rsync命令失败:sh: rsync: not found 错误求助
解决SSH远程执行rsync提示"sh: rsync: not found"的问题
核心原因
远程通过SSH执行命令时,默认启动的是非交互式非登录shell,不会加载本地登录时的完整环境变量配置,导致PATH中缺少rsync的安装路径——这就是本地能执行、远程SSH调用就报错的根本原因。之前指定--rsync-path没生效,大概率是参数用法错误或路径不准确。
可行解决方案
1. 先确认rsync的真实路径
在远程服务器本地执行以下命令,拿到rsync的绝对路径:
which rsync
比如得到/usr/local/bin/rsync或/usr/bin/rsync,后续命令里用这个真实路径。
2. 直接用绝对路径调用rsync
把rsync的绝对路径写进SSH命令里,同时注意变量展开的时机:
- 如果
$SRC_DIR和$BUILD_DIR是远程服务器上的环境变量,用单引号包裹命令,避免本地shell提前解析变量:ssh root@"$build_server" '/usr/local/bin/rsync -avzh $SRC_DIR/main $BUILD_DIR || exit 1' - 如果这两个变量是Jenkins本地的变量,用双引号让本地先展开变量,再传递到远程:
ssh root@"$build_server" "/usr/local/bin/rsync -avzh $SRC_DIR/main $BUILD_DIR || exit 1"
3. 让远程shell加载完整环境
如果不想写绝对路径,可以强制远程shell以登录模式启动,加载/etc/profile或~/.bash_profile这类配置文件,补全PATH:
ssh root@"$build_server" 'bash -l -c "rsync -avzh $SRC_DIR/main $BUILD_DIR || exit 1"'
4. 修正--rsync-path的用法
--rsync-path是用来指定远程端rsync的路径,必须放在rsync命令的参数位置里,正确写法如下:
ssh root@"$build_server" "rsync -avzh --rsync-path=/usr/local/bin/rsync $SRC_DIR/main $BUILD_DIR || exit 1"
内容的提问来源于stack exchange,提问作者DevOps__1903
相关产品推荐
相关产品推荐

