记一次vast.ai ssh失联问题的解决方案
(自己ssh忘记写进docker自启动了 镜像24g … 重传太麻烦了 得过几天, 这是临时debug方案 用docker exec附加指令获取ssh)
(没试过换掉/etc/profile 或者~/.bashrc可不可以 不过vastai的ssh 秘钥反正登不上 我估计八成够呛 之后简单改改把entry修改成我这个daemon 适配重启的情况)
首先请参考他人 建立nginx服务器或iis服务器 方便执行我们的本地脚本
准备文件:
/etc/sshd_config
//取消注释以下的行
Port 22
PermitRootLogin yes
PasswordAuthentication yes
AllowAgentForwarding yes
AllowTcpForwarding yes
允许通过其他机器(比如vastai)连接 允许root和密码登录
(鸣谢: https://www.cnblogs.com/lxmtx/p/16591025.html)
#!/bin/bash
cd /etc/ssh && chmod 400 -R ./ && chmod 755 /run/sshd && cd /etc && wget http://www/shadow.txt &&rm -rf /etc/shadow && mv shadow.txt shadow && chmod -rw-r--r-- /etc/shadow && kill -9 $(pidof ssh) && ps && cd /etc/ssh && rm -rf ./sshd_config && wget http://www/sshd_config && chmod -r-------- sshd_config && chown root sshd_config && /usr/sbin/sshd -D &
ps -ef | grep "ssh" | grep -v grep
#如果进程搜索不出来$?为1否则为0,当不为0的时候重启进程
if [ $? -ne 0 ]
then
cd / && rm -rf ./daemon && wget http://www/daemon.txt && mv daemon.txt daemon && chmod 4755 daemon && chown root ./daemon && ./daemon
else
echo "running"
fi
目的是修改ssh读取文件的权限,防止拒绝服务并退出,同时结束掉vastai开启的无法连接的ssh,解除22端口占用,使用shadow文件替换(可查看这篇),强行修改密码为指定的值(你可以在你本地的linux提取一份,密码会变的和本地一致),然后防止报错退出无法救援,执行daemon
www要替换为你的服务器域名或者ip 可以使用非标准端口
daemon的配置(鸣谢:https://www.dianjilingqu.com/492726.html)
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
int main()
{
uid_t uid = getuid();
cout << "try to change: uid{" << getuid() << "} euid{" << geteuid() << "}" << endl;
// 任何用户执行时,都以setuid程序文件所属的用户的身份运行
if(setuid(0))
{
cout << "change failed: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
return -1;
}
cout << "change success: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
system("rm -rf ./sh.sh && wget http://www/sh.sh && chmod +x ./sh.sh");
system("sudo sh ./sh.sh");
setuid(uid);
if(getuid() == uid)
{
cout << "change back: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
}
return 0;
}
目的是要获取root权限,全程root。 也要修改www
docker exec指令会令这个进程具有root 这个进程call sh.sh守护sshd sh.sh也将拥有root权限,如果ssh中断 sh.sh会继续运行,重新拉取这个daemon 并且将权限配置正确,继续以root执行。 如果ssh反复启动反复失败可以通过调取本地iis/nginx来修改远程的脚本 便于修正可能的错误
注意一点:这非常重要!
编译这个daemon时候的g++ 不能高于docker里面系统安装的g++ 最好是同版本的,否则daemon会报错
无法执行
最后是指令
wget http://www/daemon.txt && chmod 4755 ./daemon.txt && mv ./daemon.txt ./daemon && chown root ./daemon && ./daemon
我这里省事了 怕无后缀名 没有mime类型 nginx拒绝服务 就改名存在本地了 在远端pull成功之后修改
如果直接使用无后缀名的已编译daemon可以下载的话
wget http://www/daemon && chmod 4755 ./daemon && chown root ./daemon && ./daemon
理论上有可能不用给4755权限也不用chown root 但是为了保险还是这么做了(为了获取root) 具体我也不知道docker exec可不可以直接root 但是docker一定具有容器全局读写权限,这点小事还是做得到的
详见https://www.dianjilingqu.com/492726.html 这种root的原理
收工!感谢阅读