GVKun编程网logo

通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接

1

如果您对通过提供交互式目标服务器选择的跳转主机使用PythonParamiko进行连接感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于通过提供交互式目标服务器选择的跳转主机使

如果您对通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接的详细内容,并且为您提供关于#paramiko# 解决安装 paramiko 的问题记录、AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”、cube.js 通过presto-gateway 进行连接、KeystoneJS 关系,如何使用一组 id 进行连接的有价值信息。

本文目录一览:

通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接

通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接

如何解决通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接

我正在尝试通过跳转服务器使用 SSH 协议连接到服务器。当我使用协议通过终端连接时,跳转服务器会打开一个 shell 并从提供的可用服务器列表中询问服务器编号,然后是用户或密码。使用库 Paramiko。

我的代码:

  1. import paramiko
  2. client = paramiko.SSHClient()
  3. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  4. client.connect(
  5. hostname="server_ip",username="user",password="pass",look_for_keys=False,allow_agent=False
  6. )
  7. com=''1''
  8. stdin,stdout,stderr = client.exec_command(com)
  9. data = stdout.read() + stderr.read()
  10. print(data.decode(''utf-8''))

我收到消息:

目标无效。

我在跳转服务器上的 shell 是这样的:

解决方法

您的跳转服务器可能仅在交互式 shell 会话中显示选择。因此,您将不得不使用 SSHClient.invoke_shell,否则在自动化连接时这不是一件好事。

另见What is the difference between exec_command and send with invoke_shell() on Paramiko?

#paramiko# 解决安装 paramiko 的问题记录

#paramiko# 解决安装 paramiko 的问题记录

在 debian 上安装出了些问题,导致 import paramiko 失败,解决方法:

先 pip 安装
apt-get install libssl-dev
pip install cffi --upgrade
apt-get install libffi-dev
pip install cryptography --upgrade

AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”

AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”

如何解决AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”

我目前正在开发一个程序,该程序尝试联系许多运行 Cisco IOS 的路由器以获取其当前配置。我正在尝试使用 Paramiko 模块的 SSHClient 对象来实现这一点:

  1. def get_config(file_path,ip,ip_number):
  2. ssh = paramiko.SSHClient()
  3. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  4. ssh.connect(ip,port=22,username="user",password="pw",look_for_keys=False,timeout=None)
  5. stdin,stdout,stderr = ssh.exec_command("show running-config \\n")

之后,配置被写入子文件夹内的特定文件,该文件的名称为变量 ip_number。由于这是通过一百多个路由器完成的,因此我尝试使用线程模块来加快进程。当我一次使用更多线程时,我不断遇到的问题开始更频繁地发生,因此我以这种方式使程序一次仅使用 14 个线程(服务器在 14 核 cpu 上运行):

  1. amount_ip_blocks = int(len(ip_list))/14
  2. if len(ip_list) - 14*amount_ip_blocks != 0:
  3. amount_remaining_ips = len(ip_list) - 14*amount_ip_blocks
  4. for j in range (0,amount_ip_blocks):
  5. threads = []
  6. for i in range (j*14,j*14 + 14):
  7. thread = threading.Thread(target=get_config,args=(path,ip_list[i],i,))
  8. thread.start()
  9. threads.append(thread)
  10. for thread in threads:
  11. thread.join()

最后,对剩余的 IP 执行相同的操作。

现在,当处理第一个 14 个 IP 块时,这段代码在不同线程(并不总是线程 1)上同时给我零到四次以下异常:

  1. Exception in thread Thread-1:
  2. Traceback (most recent call last):
  3. File "D:\\Program Files\\Python\\lib\\threading.py",line 932,in _bootstrap_inner
  4. self.run()
  5. File "D:\\Program Files\\Python\\lib\\threading.py",line 870,in run
  6. self._target(*self._args,**self._kwargs)
  7. File "D:\\location_of_my_program\\config_getter.py",line 99,in get_config
  8. ssh.connect(ip,timeout=None)
  9. File "D:\\Program Files\\Python\\lib\\site-packages\\paramiko-2.7.2-py3.8.egg\\paramiko\\client.py",line 435,in connect
  10. File "D:\\Program Files\\Python\\lib\\site-packages\\paramiko-2.7.2-py3.8.egg\\paramiko\\client.py",line 691,in _auth
  11. File "D:\\Program Files\\Python\\lib\\site-packages\\paramiko-2.7.2-py3.8.egg\\paramiko\\agent.py",line 372,in __init__
  12. AttributeError: module ''paramiko.win_pageant'' has no attribute ''can_talk_to_agent''

我曾尝试在网上查找此异常,但找不到任何内容。我还尝试查看 paramiko 的代码,看看它对我是否有意义,但无济于事。最后,我尝试调整 IP 块的大小,较小的块似乎不太经常导致问题,如果发生,它总是在第一个 IP 块上发生。经过大量实验,我无法推断出任何规律性。 有没有办法解决这个问题?或者根本不可能同时/在同一个程序中使用paramiko运行多个SSH连接? 或者更好的是,有人知道这个问题是如何发生的吗?

解决方法

我没有解决方案,但可能是一种解决方法。由于您似乎没有使用代理,您是否尝试将其关闭?

SSHClient.connect 调用中设置 allow_agent=False

cube.js 通过presto-gateway 进行连接

cube.js 通过presto-gateway 进行连接

cube.js 对于presto 的支持是通过presto-client 刚好简单修改了一个可以支持presto-gateway 连接的
以下是一个简单的集成,以及关于集成中原有的一些修改

环境准备

  • docker-compose 文件
version: "3"
services:
  proxy:
     image: dalongrong/presto-gateway:1.6.1
     ports:
     - "8888:8888"
     - "8082:8082"
     - "8083:8083"
     build: ./
     volumes:
     - "./config.yml.template:/config.yml.template"
  presto1:
     image: starburstdata/presto
     ports:
     - "8080:8080"
  presto2:
     image: starburstdata/presto
     ports:
     - "8081:8080"
  • presto-gateway 配置
requestRouter:
  port: 8888
  name: prestoRouter
  cacheDir: /var/log/prestoproxy/cache
  historySize: 1000
backends:
  - localPort: 8082
    name: presto1
    proxyTo: http://presto1:8080
    routingGroup: adhoc
  - localPort: 8083
    name: presto2
    proxyTo: http://presto2:8080
    routingGroup: scheduled
server:
  applicationConnectors:
    - type: http
      port: 8090
  adminConnectors:
    - type: http
      port: 8091
notifier:
  smtpHost: localhost
  smtpPort: 587
  sender: presto-gw-monitor-noreply@lyft.com
  recipients:
    - prestodev@yourorg.com
modules:
  - com.lyft.data.gateway.module.ProxyBackendProviderModule
  - com.lyft.data.gateway.module.GatewayProviderModule
  - com.lyft.data.gateway.module.NotifierModule
managedApps:
  - com.lyft.data.gateway.GatewayManagedApp
  - com.lyft.data.gateway.ActiveClusterMonitor
# Logging settings.
logging:
  # The default level of all loggers. Can be OFF,ERROR,WARN,INFO,DEBUG,TRACE,or ALL.
  level: INFO
  # Logger-specific levels.
  loggers:
    com.lyft: DEBUG
  appenders:
    - type: console
    - type: file
      currentLogFilename: /var/log/prestoproxy/prestoproxy-java.log
      archivedLogFilenamePattern: /var/log/prestoproxy/prestoproxy-java-%d{yyyy-MM-dd}-%i.log.gz
      archivedFileCount: 7
      timeZone: UTC
      maxFileSize: 100MB

cube.js presto 项目

  • 初始化
cubejs create -d presto mypresto
  • 修改生成的项目
    主要是关于presto-client 的替换以及环境变量的添加,还有就是部分代码的简单修改
  • package.json 改进
 
yarn add @dalongrong/presto-client
 
CUBEJS_DB_HOST=localhost
CUBEJS_DB_USER=dalong
CUBEJS_DB_PORT=8888
CUBEJS_DB_CATALOG=memory
CUBEJS_DB_TYPE=prestodb
CUBEJS_ROUTING_GROUP=scheduled
CUBEJS_DB_SCHEMA=default
CUBEJS_API_SECRET=71a4454929e8b429158759a29f4a7ddfcc957505efed7e5a93e02a859d7bd9f7ed7e49daac2243024a94cdaa3e88faa4cd3946dae7aea562f947bb1ed525125b
const presto = require(‘@dalongrong/presto-client‘);
const {
  map,zipObj,prop,concat
} = require(‘ramda‘);
const BaseDriver = require(‘@cubejs-backend/query-orchestrator/driver/BaseDriver‘);
const sqlString = require(‘sqlstring‘);
?
class PrestoDriver extends BaseDriver {
  constructor(config) {
    super();
?
    this.config = {
      host: process.env.CUBEJS_DB_HOST,
      port: process.env.CUBEJS_DB_PORT,
      catalog: process.env.CUBEJS_DB_CATALOG,
      schema: process.env.CUBEJS_DB_SCHEMA,
      user: process.env.CUBEJS_DB_USER,
      routingGroup: process.env.CUBEJS_ROUTING_GROUP,
      basic_auth: process.env.CUBEJS_DB_PASS ? {
        user: process.env.CUBEJS_DB_USER,
        password: process.env.CUBEJS_DB_PASS
      } : undefined,
      ...config
    };
?
    this.catalog = this.config.catalog;
    this.client = new presto.Client(this.config);
  }
?
  testConnection() {
    const query = sqlString.format(`show catalogs like ?`,[`%${this.catalog}%`]);
?
    return this.queryPromised(query)
      .then(catalogs => {
        if (catalogs.length === 0) {
          throw new Error(`Catalog not found ‘${this.catalog}‘`);
        }
      });
  }
?
  query(query,values) {
    const queryWithParams = sqlString.format(query,values);
    return this.queryPromised(queryWithParams);
  }
?
  queryPromised(query) {
    return new Promise((resolve,reject) => {
      let fullData = [];
?
      this.client.execute({
        query,
        schema: this.config.schema || ‘default‘,
        routingGroup: this.config.routingGroup,
        data: (error,data,columns) => {
          const normalData = this.normalizeResultOverColumns(data,columns);
          fullData = concat(normalData,fullData);
        },
        success: () => {
          resolve(fullData);
        },
        error: error => {
          reject(error.message || JSON.stringify(error));
        }
      });
    });
  }
?
  normalizeResultOverColumns(data,columns) {
    const columnNames = map(prop(‘name‘),columns || []);
    const arrayToObject = zipObj(columnNames);
    return map(arrayToObject,data || []);
  }
}
?
module.exports = PrestoDriver;

启动&&效果

yarn dev

 

 

 

说明

以上是一个简单的集成,通过presto-gateway 可以方便我们的管理,是一个很不错的工具

参考资料

https://github.com/cube-js/cube.js
https://github.com/rongfengliang/presto-client-node
https://github.com/lyft/presto-gateway

KeystoneJS 关系,如何使用一组 id 进行连接

KeystoneJS 关系,如何使用一组 id 进行连接

如何解决KeystoneJS 关系,如何使用一组 id 进行连接

我正在使用新版本的 Keystone Next,我正在尝试使用一组 id 一次连接多个项目。似乎 connect 支持,接受一组对象。

const FINISH_VOCABULARY_QUIZ_MUTATION = gql`
mutation FINISH_VOCABULARY_QUIZ_MUTATION(
    $userId: ID!
    $wordId: ID!
) {
    updateUser(id: $userId,data: {
        wrongAnswers: {
            connect: [{id: "idblabla"},{id: "idblabla2"}]
        }
    }) {
        id
    }
}`;

但我似乎无法弄清楚如何将这个 id 数组作为变量传递给我的突变。 我知道我需要创建一个新类型?文档还没有完成,所以还没有关于它的任何内容。 我也尝试过使用字符串插值来形成我的查询,但它似乎不是 GraphQl 中的东西。

解决方法

这更像是一个 GraphQL 问题而不是 KeystoneJS 问题,但要在这里朝着正确的方向前进,您需要将查询更改为如下所示:

const FINISH_VOCABULARY_QUIZ_MUTATION = gql`
mutation FINISH_VOCABULARY_QUIZ_MUTATION(
    $userId: ID!,$ids: [UserWhereUniqueInput!]!
) {
    updateUser(id: $userId,data: {
        wrongAnswers: {
            connect: $ids
        }
    }) {
        id
    }
}`;

然后将您的 id 数组映射到具有 id 字段的对象数组。

,

有一个更好的方法

const FINISH_VOCABULARY_QUIZ_MUTATION = gql`
mutation FINISH_VOCABULARY_QUIZ_MUTATION(
    $userId: ID!,$data: SomeAPIDefinedMutationUniqueInput
) {
    updateUser(id: $userId,data: $data)
      id
    }
}`;

这样你:

附注。老实说,应该有一些特定的 [to quises] 突变(不要为此使用 userUpdate),用户(或更好的测验)id 定义在 SomeAPIDefinedUniqueInput 中。>

我们今天的关于通过提供交互式目标服务器选择的跳转主机使用 Python Paramiko 进行连接的分享已经告一段落,感谢您的关注,如果您想了解更多关于#paramiko# 解决安装 paramiko 的问题记录、AttributeError: 模块“paramiko.win_pageant”在使用来自 Windows Server 的 Paramiko 进行连接时没有属性“can_talk_to_agent”、cube.js 通过presto-gateway 进行连接、KeystoneJS 关系,如何使用一组 id 进行连接的相关信息,请在本站查询。

本文标签:

上一篇Python 单元测试 - 如何在 setUpClass 内部断言?(python assert断言)

下一篇如何从 Python 客户端为 InfluxDB 指定 range() 中的绝对时间?(python操作influxdb)