我有一个 DMZ,其中有一个运行 Ubuntu 11.04 的 Web 服务器和一个运行 Ubuntu 11.10 的应用程序服务器。我已经进行了设置,以便可以通过运行以下命令从 Web 服务器 scp 到应用程序服务器
ssh-keygen
ssh-copy-id [email protected]
其中 192.168.1.6 是应用程序的本地 IP 地址。服务器和 peter 是我的登录帐户名。但是,我想使用 PHP 文件中的命令来复制文件以响应通过基于 LAMP 的网站发出的调用。我的问题是,我的 Web 应用程序的“用户”是 www-data,它不是真正的用户,因此我无法为其创建密钥。
我尝试了概述的程序这里.然后我就这么做了
su
su www-data
在 Web 服务器上(我猜是伯克利讨论中的“服务器”)。不幸的是,当我尝试 scp 到应用程序服务器/客户端时,仍然会要求输入密码。
我试过
scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
输出与我(成功)从 peter 帐户 scp 时的输出非常相似。但是,最后几行有所不同。
debug1: Authentications that can continue: publickey,password
debug1: Offering DSA public key: /var/www/.ssh/id_dsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Offering ECDSA public key: /var/www/.ssh/id_ecdsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
[email protected]'s password:
如果有人能告诉我或者帮助我找到问题所在,我将不胜感激。
答案1
读了您给出的链接后,请确保使用 authorized_keys,而不是 authorized_keys2。后者已被弃用多年,在某些版本的 OpenSSH 中根本不起作用。
诊断此问题的最简单方法是使用 SSH 服务器的调试实例。在服务器上,运行:
# /usr/sbin/sshd -ddep 2222
... 在调试模式下运行 SSH 守护程序,监听端口 2222。使用以下命令重做 scp 命令:
$ scp -o port=2222 ...
...看看服务器说什么。
对于 John 的安全担忧:如果您决定继续使用 www-data 帐户,则可以使用 authorized_keys 中的“强制命令”选项将其密钥限制为仅执行某些操作(例如传输某些文件)。
答案2
你说你已经尝试过
scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
但您想要使用的密钥没有出现在任何地方。请尝试:
scp -vvv -i /path/to/private/key /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
无论如何,您应该确保您的连接仅限于此特定命令。我不确定 SCP 是否提供限制命令的方法(例如使用 SSH 强制命令)。然后我会改用 SSH 而不是 rsync 来确保只启动 rsync 命令。这基本上提供了与 scp 相同的服务,但您的密钥可以用强制命令标记,这可能更安全。
答案3
我使用 inotify 来实现 John Gardeniers 建议的方法。这很简单,现在运行良好。我刚刚编写了一个 C++ 应用程序,当目录中的文件被修改时,它会执行 scp,就像 PHP 代码中所做的那样。运行良好。
谢谢,
彼得