我正在尝试通过 ssh 进入已 root 的 Android 手机,但它给了我一个错误Permission denied (publickey).
,并且日志显示Authentication refused: bad ownership or modes for directory
,尽管我已经仔细且正确地配置了权限和所有权,如下所示。
这是文件的内容sshd_config
。
- /数据/ssh/sshd_config
AuthorizedKeysFile /data/.ssh/authorized_keys
ChallengeResponseAuthentication no
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin yes
Subsystem sftp internal-sftp
pidfile /data/ssh/sshd.pid
这是文件的内容99sshd
。
- /data/local/userinit.d/99sshd
#!/system/bin/sh
umask 077
# DEBUG=1
DSA_KEY=/data/ssh/ssh_host_dsa_key
DSA_PUB_KEY=/data/ssh/ssh_host_dsa_key.pub
RSA_KEY=/data/ssh/ssh_host_rsa_key
RSA_PUB_KEY=/data/ssh/ssh_host_rsa_key.pub
AUTHORIZED_KEYS=/data/.ssh/authorized_keys
DEFAULT_AUTHORIZED_KEYS=/data/.ssh/authorized_keys
if [ ! -f $DSA_KEY ]; then
/system/bin/ssh-keygen -t dsa -f $DSA_KEY -N ""
chmod 600 /$DSA_KEY
chmod 644 $DSA_PUB_KEY
fi
if [ ! -f $RSA_KEY ]; then
/system/bin/ssh-keygen -t rsa -f $RSA_KEY -N ""
chmod 600 /$RSA_KEY
chmod 644 $RSA_PUB_KEY
fi
if [[ ! -f $AUTHORIZED_KEYS && -f $DEFAULT_AUTHORIZED_KEYS ]]; then
cat $DEFAULT_AUTHORIZED_KEYS > $AUTHORIZED_KEYS
fi
if [ "1" == "$DEBUG" ] ; then
# run sshd in debug mode and capture output to logcat
/system/bin/logwrapper /system/bin/sshd -f /data/ssh/sshd_config -D -d
else
# don't daemonize - otherwise we can't stop the sshd service
/system/bin/sshd -f /data/ssh/sshd_config -D
fi
另外,我还要确保客户端公钥位于/data/.ssh/authorized_keys
.
现在,这是相关文件和目录的权限和所有权。
# ls -alt /data/ssh
total 56
-rw-r--r-- 1 root root 6 2023-11-16 11:56 sshd.pid
-rw-rw---- 1 root root 269 2023-11-16 10:53 sshd_config
drwxrwx--x 54 system system 4096 2023-11-16 10:47 ..
drwxr-x--- 3 root shell 4096 2023-11-16 10:13 .
-rw------- 1 root root 505 2023-11-16 10:11 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 176 2023-11-16 10:11 ssh_host_ecdsa_key.pub
-rw------- 1 root root 411 2023-11-16 10:11 ssh_host_ed25519_key
-rw-r--r-- 1 root root 96 2023-11-16 10:11 ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 604 2023-11-16 10:11 ssh_host_dsa_key.pub
-rw------- 1 root root 1381 2023-11-16 10:11 ssh_host_dsa_key
-rw-r--r-- 1 root root 568 2023-11-16 10:11 ssh_host_rsa_key.pub
-rw------- 1 root root 2602 2023-11-16 10:11 ssh_host_rsa_key
drw------- 2 root shell 4096 1974-02-26 03:43 empty
# ls -alt /data/.ssh
total 16
drwxrwx--x 54 system system 4096 2023-11-16 10:47 ..
-rw------- 1 root root 1144 2023-11-16 10:17 authorized_keys
drwx------ 2 root root 4096 2023-11-16 10:00 .
# ls -alt /data/local/userinit.d/99sshd
-rwxr-xr-x 1 root root 969 2023-11-16 10:54 /data/local/userinit.d/99sshd
现在运行 sshd 服务器。
# /data/local/userinit.d/99sshd
在客户端计算机上,我尝试像平常一样连接到电话。
PS C:\Users\user> ssh [email protected]
[email protected]: Permission denied (publickey).
并且失败如上所示的错误。
于是我查看了手机上的日志,日志如下所示。
# logcat | grep -i ssh
11-16 11:56:28.394 10599 10599 I /system/bin/sshd: Authentication refused: bad ownership or modes for directory /data
但我看不到相关文件的任何权限或所有权问题,如上面所示。
作为注释,我参考了:
电话是:
- 华硕 ZenFone3 Android 10
感谢您的帮助。
答案1
你应该设置/数据及其子目录由 root 拥有,权限为 0755 (rwxr-xr-x)。或者,您可以通过设置禁用此权限检查严格模式到“不”sshd_配置手机上的文件。
该错误消息具体涉及/数据目录。根据源代码,对于授权密钥文件,sshd
检查文件绝对路径中的所有目录是否由用户或 root 拥有,并且没有目录是组可写或全局可写的。在你的情况下,这是/数据目录:
drwxrwx--x 54 system system 4096 2023-11-16 10:47 ..
换句话说,组写访问权限已启用,并且(直到您在注释中更改它)所有者和组是“system”。对于以“root”身份登录尝试来说,这两种情况都是不可接受的。