1,在docker容器内执行以下python代码或根据需要插入到你的.py文件中:

import paramiko #通过pip3 install paramiko 安装
s = paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname="A",port=22,username="B",password="C") #A为容器虚拟网桥的IP地址,默认为172.17.0.1,B为容器的用户名,C是密码
stdin,stdout,stderr = s.exec_command("python3 /home/aiot/test_ip.py") #/home/aiot/test_ip.py是我宿主机下获取ip的脚本
ip = stdout.read()

test_ip.py脚本内容为:

import socket
"""get localhost ip address"""
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
print(ip)

可能遇到的问题以及解决办法:
1,报错"paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 172.17.0.4"

docker 查看宿主机ip docker获取宿主机ip地址_linux


主要原因是因为宿主机和docker容器的SSH端口22没有打开,请确保宿主机和docker容器内都启动了SSH服务并且22端口都已经开放。具体请参考这篇博客

2,报错"paramiko.ssh_exception.AuthenticationException: Authentication failed."

docker 查看宿主机ip docker获取宿主机ip地址_docker 获取服务器剩余磁盘空间_02


遇到这个问题首先请确保你的hostname、username、password都正确。再去到容器内/etc/ssh/sshd_config处看看配置文件中将

PermitRootLogin prohibit-password

改为

PermitRootLogin yes

如图:

docker 查看宿主机ip docker获取宿主机ip地址_docker 获取服务器剩余磁盘空间_03


如果解决完这一步还是报相同的错,则可以在容器内新建一个普通用户再去执行代码,应该可以解决了。

Done!