我有一个Python脚本,我试图在Google Cloud Compute Engine上运行。我在计算引擎上设置并运行了Jupyter笔记本,当我连接到它并从连接到Compute Engine实例的笔记本电脑上的Notebook窗口运行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之前它正在工作)我收到错误" shell请求在通道0和#34上失败;所以我让事情变得更糟,代码仍然无法运行。
为主机名执行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()
答案 0 :(得分:1)
好的我找到了解决方案,它来自于此,运行命令
gcloud compute ssh INSTANCE_NAME
Doin创建了Python脚本所需的SSH密钥文件 - 因此不需要对Python代码进行任何更改。我仍然在通道0"上收到错误" shell请求失败如果我尝试在Ubuntu的命令行中运行一个基本的ssh连接,那么当我尝试通过Unix命令进行操作时,我明显破坏了一些东西,但我的主要要求是让python脚本正常工作。
======================== 以下是我用来查找此修复程序的信息来源