远程执行shell函数提示“No Such File or Directory”问题求助
排查步骤与解决方法
1. 确认远程主机上文件的真实状态
先直接验证远程主机上目标文件的存在性、权限和内容完整性:
ssh user@host 'ls -ld /usr/local/bin /usr/local/bin/myscript.sh && cat /usr/local/bin/myscript.sh | head -5'
需确认:
/usr/local/bin/myscript.sh确实存在user账号对该文件拥有读权限(权限位显示至少包含r)- 文件内容无损坏,前几行输出正常
2. 修正远程命令的执行逻辑
当前命令ssh user@host script1.sh softrun存在核心逻辑问题,需根据script1.sh的位置调整:
- 如果
script1.sh在本地主机:远程主机无法直接读取本地脚本,需通过标准输入传递脚本内容并调用函数ssh user@host 'bash -s' << 'EOF' softrun() { source /usr/local/bin/myscript.sh } softrun EOF - 如果
script1.sh已在远程主机(比如user的家目录):需先加载脚本定义函数,再调用函数(直接执行脚本只会定义函数,不会触发执行)ssh user@host 'source ~/script1.sh && softrun'
3. 排查环境差异导致的异常
远程通过ssh执行命令时,默认是非登录非交互式shell,不会加载~/.bashrc、~/.profile等配置文件。可验证远程环境的基础路径信息:
ssh user@host 'echo $PATH && which bash'
若发现/usr/local/bin不在PATH中(不影响绝对路径调用,但可辅助排查环境一致性),或bash的实际路径与脚本中使用的不一致,需对应调整脚本或命令中的路径。
4. 检查目标脚本的shebang(针对直接调用场景)
如果使用/bin/bash /usr/local/bin/myscript.sh仍报错,检查目标脚本的首行shebang:
ssh user@host 'head -1 /usr/local/bin/myscript.sh'
若shebang为#!/usr/bin/bash但远程主机的bash实际在/bin/bash,需修改shebang为#!/bin/bash,或始终用bash命令强制调用。
内容的提问来源于stack exchange,提问作者aryabhatta
相关产品推荐
相关产品推荐

