docker忘记自启动ssh的解决方案

记一次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的原理
收工!感谢阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值