python - 谷歌云 ssh 密钥错误 - python 脚本
问题描述
我有一个尝试在 Google Cloud Compute Engine 上运行的 Python 脚本。我在 Compute Engine 上设置并运行了 Jupyter Notebooks,当我连接到它并从连接到 Compute Engine 实例的笔记本电脑上的笔记本窗口运行 SFTP 连接脚本时,它运行正常。
当我直接在 Compute Engine 上通过命令行运行相同的脚本时,出现 SSH 错误。
(2018-06-15 12:39:52; transport.py:1636) DEBUG:paramiko.transport: Adding ecdsa-sha2-nistp521 host key for sftp.############.com: b'ff97f###################'
(2018-06-15 12:39:52; transport.py:1636) DEBUG:paramiko.transport: Trying SSH agent key b'bc574#######################'
(2018-06-15 12:39:52; transport.py:1636) DEBUG:paramiko.transport: userauth is OK
(2018-06-15 12:39:52; transport.py:1636) INFO:paramiko.transport: Authentication (publickey) failed.
(2018-06-15 12:39:52; transport.py:1636) INFO:paramiko.transport: Disconnect (code 7): Bad service id
(2018-06-15 12:39:53; get_file_sftp.py:29) ERROR:__main__: SFTP Connection: Connection Error
我尝试使用生成密钥
ssh-keygen hostname
它创建了一个 ECDSA 密钥,但是现在当我从命令行进行常规 ssh 连接时(在我开始弄乱 keygen 之前它正在工作)我收到错误“通道 0 上的 shell 请求失败”,所以我做了一些事情更糟糕的是,代码仍然无法运行。
对主机名执行 ssh-keyscan 会返回两条记录,一条 RSA 和一条 ECDSA
这是我的 Python 代码
import paramiko
from parse_config import fn_parse_config
from configparser import ConfigParser
import logging
import logging.config
import datetime
def fn_get_file_sftp():
#initialise logging function
logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
logger=logging.getLogger(__name__)
#get details from config files
sftp_params = fn_parse_config("etl_process.ini", "remote_sftp")
sftp_folders = fn_parse_config("etl_process.ini", "sftp_folders")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#print('start')
try:
logger.info("SFTP Connection:Send credentials")
ssh.connect(**sftp_params)
logger.info("SFTP Connection:SUCCESS")
except paramiko.SSHException:
logger.error("SFTP Connection: Connection Error")
sftp = ssh.open_sftp()
#sftp.chdir("/vivobarefoot/")
print (sftp.listdir("/"))
for file in sftp.listdir("/"):
sftp.get(remotepath = sftp_folders.get('remote_path') + file, localpath=sftp_folders.get('local_path') + file )
logger.info("RETRIEVED SFTP FILE: " + file)
sftp.remove(sftp_folders.get('remote_path') + file)
logger.info("REMOVED SFTP FILE: " + file)
ssh.close()
logger.info("SFTP Connection:CLOSED")
fn_get_file_sftp()
解决方案
好的,我找到了解决方案,它来自这个,运行命令
gcloud compute ssh INSTANCE_NAME
这样做创建了 Python 脚本所需的 SSH 密钥文件——因此不需要对 Python 代码进行任何更改。如果我尝试在 Ubuntu 的命令行中运行基本 ssh 连接,我仍然会收到错误“通道 0 上的 shell 请求失败”,所以当我尝试通过 Unix 命令执行此操作时,我显然破坏了一些东西,但我的主要要求是让 python 脚本工作。
======================== 这是我用来查找此修复程序的信息的来源
https://groups.google.com/forum/#!topic/gce-discussion/PXEzoZQpcSo
- 向 GCE 防火墙添加规则: $ gcloud compute firewall-rules create mySSH --allow tcp:22 --source-ranges 0.0.0.0/0
- 通过 telnet 测试规则:$ telnet IP 22
- 如果 telnet 正在工作,那么 SSH 正在接受连接,所以尝试 ssh : $ gcloud compute ssh INSTANCE_NAME
推荐阅读
- c# - 如何使用 System.Text.Json (自定义转换器或其他方法)仅序列化对象属性的内容
- reactjs - React-Redux 更新部分状态
- node.js - 如何为 Google 登录设置我的 React 应用程序(不是 react-google-login)
- postgresql - 语法错误 postgres psycopg2 jupyter notebook
- angular - 弹出窗口中带有 oauth2 的 Angular x Symfony(通过代理?)
- graphql - 我如何设置我的 ApolloServer 默认打开一个 graphql 游乐场而不是 apollographql 沙箱?
- .htaccess - 如果请求是实际目录,.htaccess 不会重写
- javascript - 检测 Img 元素 src 是否已更改然后执行操作
- python - 看门狗不能给函数参数
- python - 在 Python3.6 脚本中间使用 asyncio