Я пишу сценарий, который использует Tailscale API для получения списка устройств, а затем использует Paramiko для подключения через SSH и запроса некоторых данных на устройстве. Вчера все работало нормально, но сегодня все соединения не удалось. Я понял, что за кулисами SSH не работает, потому что им управляет Tailscale и требуется повторная аутентификация:
ssh root@MyDevice
# Tailscale SSH requires an additional check.
# To authenticate, visit: https://login.tailscale.com/a/XXXXXX
Но как я могу обнаружить и решить эту проблему с помощью Paramiko? Мой текущий код довольно прост:
import requests
from datetime import datetime, timedelta
import paramiko
url = "https://api.tailscale.com/api/v2/tailnet/-/devices"
# https://tailscale.com/kb/1085/auth-keys ... n-auth-key
headers = {"Authorization": "Bearer GENERATED AUTH KEY"}
response = requests.get(url, headers=headers)
# print(response.json())
data = response.json()
devices = data['devices']
current = datetime.utcnow() - timedelta(minutes = 1)
for device in devices:
if 'lastSeen' in device:
last_seen = datetime.strptime(device['lastSeen'], '%Y-%m-%dT%H:%M:%SZ')
if last_seen > current:
hostname = ''
uptime_seconds = ''
if 'hostname' in device:
hostname = device['hostname']
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(device['addresses'][0], username='root')
except BaseException as error:
print('{}, An exception occurred: {}'.format(hostname, error))
else:
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command('cat /proc/uptime')
if ssh_stdout.channel.recv_exit_status() == 0:
temp = ssh_stdout.readlines()
if temp:
temp = temp[0].strip('\n').strip('\"')
uptime_seconds = temp.split()[0]
print(hostname, ',', uptime_seconds)
ssh.close()
Подробнее здесь: https://stackoverflow.com/questions/788 ... h-paramiko