crontab 不能通过ssh远程执行命令

本文探讨了CronTab任务在执行过程中遇到的问题,尤其是在shell中能正常运行但放入CronTab后出现错误的情况。文章提供了详细的解决方案,包括如何设置正确的环境变量确保任务顺利执行。

crontab 不能通过ssh远程执行命令

crontab不能正确执行的问题 http://www.cnblogs.com/shenfeng/p/crontab_fail_executing.html

近期在部署crontab任务的时候,总是遇到在shell中单独执行正常,但是放到crontab定时执行出错的问题。若出现这类场景,九成就是环境变量的问题。
因为我的定制任务,基本上都需要使用sqlplus登陆数据库获取数据,即使是在oracle用户下的crontab,还是不能正常执行。

crontab默认使用的环境变量

使用/etc/crontab中的环境变量

$ whereis crontab
crontab: /usr/bin/crontab /etc/crontab /usr/share/man/man5/crontab.5.gz /usr/share/man/man1/crontab.1.gz /usr/share/man/man1p/crontab.1p.gz

参考已知的变量值

$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

解决方法

在脚本中使用declare -x声明环境变量

可以先通过export -p命令获得正常执行时该用户下的环境变量,然后复制这些环境变量到需要执行的脚本中。

$ export -p
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/oracle"
declare -x HOSTNAME="test-rac2.test.net"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="oracle"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
declare -x MAIL="/var/spool/mail/oracle"
declare -x OLDPWD
declare -x ORACLE_BASE="/u1/app/oracle"
declare -x ORACLE_HOME="/u1/app/oracle/product/12.1.0/db1"
declare -x ORACLE_SID="TEST2"

分类: Linux




<think>我们正在解决Windows上的VSCode通过SSH连接到Ubuntu时,保存文件出现权限不足的问题。即使有时修改了权限,问题仍会重现。原因分析:1.文件/目录的所有权问题:当你在Ubuntu上修改了文件权限后,如果VSCode通过SSH连接时使用的用户不是该文件的所有者或不在拥有写入权限的组中,则保存时会提示权限不足。2.权限重置问题:有时,文件权限被重置(例如,通过git操作或某些脚本)会导致问题重现。3.SSH连接使用的用户权限不足:可能你使用了一个普通用户通过SSH连接,而该用户对某些目录(如系统目录)没有写入权限。解决方案:步骤1:检查SSH连接使用的用户在VSCode中,当你通过SSH连接时,使用的用户是你在远程连接设置中指定的用户(例如,user@host)。请确保该用户对你要编辑的文件和目录有写入权限。步骤2:检查文件/目录的权限和所有权在Ubuntu终端中,使用以下命令检查目标文件/目录的权限和所有权:```bashls-ld/path/to/directoryls-l/path/to/file```输出示例:drwxr-xr-x2usergroup4096Jun1010:00directory-rw-r--r--1usergroup1024Jun1010:00file注意:第一个字段是权限(如drwxr-xr-x),第三和第四个字段分别是所有者和组。步骤3:修改文件/目录的所有权(如果必要)如果你发现文件的所有者或组不是SSH连接的用户,你可以使用以下命令修改:```bash#修改文件的所有权sudochownusername:groupname/path/to/file#修改目录的所有权(递归)sudochown-Rusername:groupname/path/to/directory```将`username`替换为你的SSH用户名,`groupname`替换为适当的组(通常可以是与用户名相同的组)。步骤4:修改文件/目录的权限(如果必要)如果所有权正确,但权限不足(例如,组或其他用户没有写权限),可以添加写权限:```bash#给文件添加写权限(所有者、组、其他)sudochmoda+w/path/to/file#或者更安全地,只给所有者和组写权限sudochmodug+w/path/to/file#对于目录,同样操作(递归)sudochmod-Rug+w/path/to/directory```但是,更推荐的做法是确保文件的所有者和组正确,然后设置合理的权限(例如,775或770):```bashsudochmod-R775/path/to/directory#所有者、组可读写执行,其他用户可读执行```步骤5:检查父目录的权限有时,文件所在的父目录没有执行(进入)权限,也会导致无法保存。确保父目录至少对用户有执行权限(目录的执行权限允许进入目录)。通常,目录权限至少为755(所有者:rwx,组:r-x,其他:r-x)或775(组也有写权限)。步骤6:使用ACL(访问控制列表)添加更细粒度的权限(可选)如果目录需要多个用户访问,可以使用ACL:```bash#给特定用户添加权限setfacl-mu:username:rwx/path/to/directory#给特定组添加权限setfacl-mg:groupname:rwx/path/to/directory#设置默认ACL(新创建的文件继承ACL)setfacl-d-mu:username:rwx/path/to/directorysetfacl-d-mg:groupname:rwx/path/to/directory```步骤7:检查VSCode的保存操作是否触发其他进程改变了权限如果你发现修改权限后问题会在一段时间后重现,可能是由于以下原因:-自动构建工具(如make、npm等)在构建过程中修改了文件权限。-版本控制系统(如git)在拉取或切换分支时重置了文件权限。-定时任务或脚本修改了文件权限。解决方案:-对于构建工具:检查构建脚本,确保不会重置权限。-对于git:可以通过设置git的配置文件来保留文件权限(注意:git默认只跟踪可执行权限):```bashgitconfigcore.filemodetrue#跟踪文件权限```但是,这可能会带来其他问题,因为不同开发者的环境可能不同。更好的做法是确保在构建脚本中设置正确的权限。步骤8:在VSCode中尝试使用sudo保存(不推荐,但可作为临时方案)如果以上方法都不适用,且你编辑的文件需要sudo权限(如系统配置文件),则可以考虑在VSCode中安装插件(如“SSHFS”)以root用户连接,但这样存在安全风险。更安全的做法是使用sudo命令在终端中编辑。然而,对于开发项目,建议将项目目录放在用户主目录下,避免使用需要root权限的目录。步骤9:检查SSH服务器的配置极少数情况下,SSH服务器的配置(如`/etc/ssh/sshd_config`)可能会限制某些操作。确保没有启用`ChrootDirectory`等限制性设置。修改配置后需要重启SSH服务:```bashsudoservicesshrestart```总结:核心问题在于SSH连接的用户对目标文件/目录没有足够的权限。通过检查并修改所有权和权限,通常可以解决。如果问题重现,则需要排查是否有其他进程(如构建脚本、git等)在重置权限。相关问题:1.如何避免在团队开发中因文件权限问题导致协作困难?2.在VSCode远程开发中,除了SSH还有哪些连接方式?3.如何配置Ubuntu上的SSH服务以提高安全性?4.为什么在git操作后文件权限会改变?如何避免?引用说明:在步骤1中,我们提到VSCodeSSH连接使用的用户,这与引用[1]中提到的通过SSH连接Linux进行开发的方式一致[^1]。</think>### Windows VSCode SSH 连接 Ubuntu 文件保存权限不足解决方案 #### 问题核心原因分析 1. **用户身份不一致** - SSH 连接用户 vs 文件所有者不一致(引用[1]) - VSCode 通过 SSH 编辑时使用登录用户身份操作文件系统 2. **权限继承问题** - 新建文件时继承父目录权限而非用户默认权限 - 目录的 SGID/SGID 位未正确设置 3. **SSH 配置限制** - `sshd_config` 中未开启 SFTP 文件写入权限 - 用户 umask 设置过于严格(默认 022) --- #### 永久解决方案(分步操作) ##### 步骤1:检查并修复Ubuntu文件权限 ```bash # 查看文件当前权限 ls -ld /path/to/project # 递归修改所有权(将your_user替换为SSH登录用户) sudo chown -R your_user:your_group /path/to/project # 设置权限继承(SGID位) sudo chmod g+s /path/to/project # 新文件继承父目录组权限 # 设置目录默认权限 sudo setfacl -d -m u::rwx,g::rwx,o::r-x /path/to/project ``` **关键参数**: - `g+s`:确保新文件继承目录组权限 - `setfacl`:设置默认访问控制列表(ACL) ##### 步骤2:配置SSH服务(`/etc/ssh/sshd_config`) ```bash sudo nano /etc/ssh/sshd_config ``` 添加/修改以下配置: ```ini # 确保SFTP子系统启用 Subsystem sftp internal-sftp # 允许用户组操作 Match Group your_group ChrootDirectory /path/to/project AllowTCPForwarding no X11Forwarding no ForceCommand internal-sftp PermitTunnel no ``` 重启服务: ```bash sudo systemctl restart sshd ``` ##### 步骤3:设置用户umask值 编辑用户配置文件: ```bash nano ~/.bashrc ``` 添加: ```bash # 宽松权限设置(新建文件默认664) umask 0002 ``` 生效配置: ```bash source ~/.bashrc ``` ##### 步骤4:VSCode 配置优化 1. **安装 Remote - SSH 扩展** 2. 连接配置添加参数: ```json "remote.SSH.defaultExtensions": [ "ms-vscode-remote.remote-ssh" ] ``` 3. 强制使用登录用户身份: ```json "remote.SSH.remotePlatform": { "your_host": "linux" } ``` --- #### 验证与调试方法 1. **权限测试命令**: ```bash # 创建测试文件 touch test_file # 验证权限 ls -l test_file # 预期输出:-rw-rw-r-- 1 your_user your_group 0 Jun 10 10:00 test_file ``` 2. **SSH连接测试**: ```bash sftp -v your_user@ubuntu_ip put local_file remote_file # 测试上传权限 ``` 3. **VSCode日志检查**: 按 `Ctrl+Shift+P` 输入 `Remote-SSH: Show Log` 查看详细错误 --- #### 预防措施 1. **权限固化配置**: ```bash # 在项目根目录创建权限固化脚本 cat > fix_perms.sh <<EOF #!/bin/bash chmod -R g+rwX /path/to/project find . -type d -exec chmod g+s {} \; setfacl -d -m u::rwx,g::rwx,o::r-x . EOF ``` 2. **Git 权限保留**: ```bash # 设置Git保留可执行权限 git config core.filemode true ``` 3. **定时权限修复**(crontab): ```bash # 每天凌晨修复权限 0 3 * * * /path/to/fix_perms.sh ``` > **原理说明**:通过 `chmod g+s` 设置目录的 SGID 位,确保新建文件继承父目录组权限;配合 `setfacl` 设置默认 ACL 规则,解决权限重置问题;SSH 服务端配置保证文件传输权限一致性[^1]。 --- ### 相关问题 1. 如何让多个SSH用户同时编辑同一项目文件而不冲突? 2. VSCode远程开发中SSH与Docker容器哪种方式更适合大型项目? 3. 当Git操作导致文件权限重置时应如何预防? 4. 如何配置VSCode实现多SSH密钥自动切换? [^1]: 通过SSH连接Linux进行开发时,文件权限问题通常源于用户身份与文件所有权不匹配[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值