AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 521142
Accepted
Tom Brossman
Tom Brossman
Asked: 2014-09-08 05:05:57 +0800 CST2014-09-08 05:05:57 +0800 CST 2014-09-08 05:05:57 +0800 CST

为什么这个 rsync + ssh cron 作业给我“权限被拒绝(公钥)”错误?

  • 772

我经常备份到我想每天同步到远程服务器的本地驱动器。

目标服务器配置为仅用于 SSH 密钥(无密码)访问。由于该服务器的主要 SSH 密钥受密码保护,因此我创建了第二个 SSH 密钥(不受密码保护)+ 用于无人值守备份的用户- 这样我就不必在 cron 运行时输入我的密码.

我正在使用 cron 和 rsync,所有命令都单独工作,但组合时会失败。

故障排除运行时我得到的最远

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"

返回错误

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]

有关如何进一步解决此问题的任何提示?


到目前为止,这是我尝试过的方法,但我没有想法:

  1. Cron 肯定在运行ps aux | grep cron
  2. /var/log/syslog 中没有异常Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. 作为备份用户工作,终端中的 SSH 到远程服务器ssh [email protected]

  4. 在终端中运行命令完美无缺rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
  5. 手动指定备份用户密钥的路径无效rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

  6. 用简单的测试命令替换非功能命令有效echo "Hello world" > ~/Desktop/test.txt

  7. 对着电脑大喊大叫/咒骂没有效果(但让我暂时感觉好些了)。


编辑 1:

这是我的 crontab 文件和它调用的脚本。

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup

和

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/

编辑 2:

只是为了澄清,/var/log/auth.log在目标服务器上包含这行Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root令人困惑,因为我不再在本地每分钟运行一次 cron,但服务器日志中每分钟仍会出现一个新条目。服务器上所有用户(包括 root)的Crontab 文件都是空的,什么都不做。

此外,用户“仅备份”仅在服务器上创建且权限有限,并且将专用 SSH 密钥复制到我的台式机上。我假设这是要走的路,因为手动运行命令时一切正常。

上面发布的 crontab 文件是给我的,我的桌面计算机上的用户“tom”。我的意图是让它调用脚本,该脚本应该以用户“仅备份”身份登录到服务器。我只是尝试运行备份脚本(而不是其中的命令)并且它成功连接并工作。我以用户“tom”的身份在我的桌面上运行它,该用户创建了无法运行的 cron 作业。这是与成功登录对应的服务器日志的输出

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
permissions
  • 8 8 个回答
  • 40237 Views

8 个回答

  • Voted
  1. Best Answer
    Alaa Ali
    2014-09-16T11:48:41+08:002014-09-16T11:48:41+08:00

    由于从命令行一切正常,错误Permission denied (publickey)意味着 SSH 部分rsync使用的身份文件与指定的用户名不同。

    根据Jan对原始问题的评论,我们可以rsync使用-e 'ssh -i /path/to/identity.file' ....

    使用以下命令从 cron 中的新环境开始并指定文件的完整路径显然可以解决问题:

    env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
    

    我仍然对这个发现很感兴趣。它可能与 cron、它从最小环境变量和 ssh-agent 开始的事实有关。我将在几天内设置相同的场景来测试它并返回报告。

    • 16
  2. SoniXtrA
    2019-04-19T01:57:11+08:002019-04-19T01:57:11+08:00

    我刚刚解决了这个让我很忙的问题..

    无法通过 SSH 在 RSYNC 中连接,尽管已经规定了 SSH 的身份......什么都没做...... RSync 说“权限被拒绝”并且 ssh 告诉我“read_passphrase:无法打开 /dev/tty:没有设备或地址这个类型”

    但是我看了一篇帖子,解释说crontab有自己的环境,和root不一样。我已经知道了,但我不明白使用 SSH-AGENT 时它对 SSH 的影响

    但是我的 SSH 密钥交换是使用 PassPhrase 完成的...所以如果环境不同并且我通过 SSH 的 RSYNC 需要一个无法输入的密码 => SSH 调试信息也指示错误:

    "debug1: read_passphrase: can not open /dev/tty: No such device or address" => 是的,没有 TTY = 没有密码 = 不允许

    在我的机器上,我使用“Keychain”来启动 SSH 代理,这样我就不必在每次尝试远程连接时都重新输入密码。钥匙串生成一个包含以下信息的文件

    SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; 导出 SSH_AUTH_SOCK;SSH_AGENT_PID = 18893; 导出 SSH_AGENT_PID;

    ==> SSH-AGENT 命令返回相同的信息。

    因此,最终,正是这些与当前会话相关的信息允许对当前会话进行未来的身份验证,而无需输入密码,因为之前已经完成并记住了......

    ==> 解决方案就在那里......在 crontab 启动的脚本中就足够了,并且“获取”包含此信息的文件或在命令行 ds the crontab 上执行它......

    例如:14 09 * * *。/home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh [email protected] :. >> /var/log/check_connexion.log 2> & 1 或在使用 SSH 启动连接的脚本中使用命令“source /home/foo/keychain/foo.server.org-sh”。

    => 有了这个采购,就不用再担心了。SSH_AUTH_SOCK 和 SSH_AGENT_PID 的信息加载在 Crontab 的环境中,因此是已知的,SSH 上的 RSYNC 可以正常工作。

    它让我很忙,但现在,它起作用了:)

    • 1
  3. jrial
    2019-06-22T07:12:38+08:002019-06-22T07:12:38+08:00

    警告那些使用 SSH 代理转发的人:

    如果您在远程主机上调试脚本时看到此行为,那是因为即使有-e "ssh -i /path/to/key"标志,ssh 也会使用您的本地(转发)密钥而不是服务器上的密钥。

    具体示例:我在开发服务器上有一个脚本,它使用 rsync over ssh 从“数据服务器”中提取数据。当我登录到开发服务器并运行它时,一切都很好,但是当从 cron 运行时,我的权限被拒绝了。在 SSH 过程中添加一些详细信息(标志-vv)我注意到以下内容:

    debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
    debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
    debug1: Authentications that can continue: publickey,password
    debug1: Next authentication method: publickey
    debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
    debug2: we sent a publickey packet, wait for reply
    debug1: Server accepts key: pkalg ssh-rsa blen 279
    debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
    debug1: Authentication succeeded (publickey).
    

    在这里让我明白的是,纯属偶然,我在本地主机上的用户名(“nighty”)与在开发服务器上的用户名(“juanr”)不同。

    请注意它如何将开发服务器上的密钥标记为“显式”,但仍然使用我笔记本电脑上的转发密钥登录。ssh-copy-id此时执行此操作无法解决任何问题,因为它只是重新安装转发密钥而不是来自开发人员的密钥服务器。如果将 ssh-copy-id 与代理转发一起使用,则需要使用 -i 标志指定要安装的密钥:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host。

    • 1
  4. Xunnamius
    2022-04-02T12:30:18+08:002022-04-02T12:30:18+08:00

    聚会有点晚了,但我遇到了同样的问题。本地用户crontab -l显示我的每日备份任务:

      0   5   *    *    5    /repos/local-bin/backup-backups daily-6
    

    当我/repos/local-bin/backup-backups daily-6直接打电话时工作。当我自己调用底层rsync命令时工作。当我ssh进入我试图备份的系统时工作。ssh-add -l显示我的环境的代理/钥匙串已经正确存储了我需要的密钥并且随时可用。

    因此,按照主要答案的建议,我添加env到/repos/local-bin/backup-backups,使 cron 任务立即运行,从 复制输出env,在每一行之前添加export,打开一个新终端,运行env -i sh,并将export命令粘贴到其中。然后我运行了ssh之前的命令但失败了。最后!不过,我注意到 cron 环境正在接收 ssh 代理的 pid,所以它应该可以正常工作......

    我跑了ssh-add -l,看到我创建的最新 SSH 密钥没有添加到这个环境的代理/钥匙串中……但是我的其他一些密钥是??这很奇怪,因为它与我在这个环境之外使用的代理一起工作......哦等等!我在这个(我的桌面)环境之外使用 KDE 的钱包/代理,并在这个环境(我的终端环境)内直接使用 ssh-agent!所以我按Ctrl+ Alt+F2退出 KDE,运行ssh-add -l,看到它也缺少我需要的键,然后运行我的add-ssh-keys脚本。通常这是在启动/登录时自动完成的,但这些是新创建的 SSH 密钥,需要添加到我的 KDE 钥匙串(我已经正确完成)和我的非 KDE ssh-agent(我忘了这样做)。希望这可以帮助其他人避免几个小时的头发拉扯:)

    • 1
  5. runlevel0
    2014-09-15T01:56:51+08:002014-09-15T01:56:51+08:00

    您是否已经尝试过清理主机文件的老技巧?我是说:

    rm ~/.ssh/known_hosts
    

    值得一试,因为 ssh 会重建它,你会摆脱陈旧的东西。您当然也可以删除属于给定 IP / 主机的部分。

    更多问题:您的 cron 作业是在您的 UID 下运行还是以用户 cron 或 root 身份运行?

    • 0
  6. Alessandro Cuttin
    2016-12-13T07:56:01+08:002016-12-13T07:56:01+08:00

    将rrsync脚本与专用 ssh 密钥一起使用,如下所示:

    远程服务器

    mkdir ~/bin
    gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
    chmod +x ~/bin/rrsync
    

    本地计算机

    ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
    scp ~/.ssh/id_remote_backup.pub [email protected]:/home/devel/.ssh
    

    远程计算机

    cat id_remote_backup.pub >> authorized_keys
    

    在新添加的行前添加以下内容

    command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding
    

    这样结果看起来像

    command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup
    

    当地的

    经许可放入您crontab的以下脚本:x

    #!/bin/sh
    echo ""
    echo ""
    echo "CRON:" `date`
    set -xv
    rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP [email protected]:/ /home/user/servidor 
    

    来源:http ://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/

    • 0
  7. Pedro Luz
    2017-09-14T00:36:03+08:002017-09-14T00:36:03+08:00

    要尝试和调试,请通过这种方式将“ssh -v”添加到 ssh 部分,您可以获得带有一些有用信息的详细模式。

    编辑:从手册页:

    -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
                 authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.
    
    • 0
  8. Anandu M Das
    2014-09-16T02:26:03+08:002014-09-16T02:26:03+08:00

    我认为您没有正确配置 sshd_config 文件。验证PermitRootLogin yes并PubkeyAuthentication yes 进行远程维护。

    • -1

相关问题

  • 访问启用的虚拟主机时出现 403 禁止错误

  • WINE 用户配置

  • 无法更新雷鸟

  • Ubuntu 在什么许可证下?可以合法修改和分发吗?

  • 文件权限如何工作?文件权限用户和组

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve