簡體   English   中英

如何使用 Paramiko 將密碼或其他字符串插入到 Linux 服務器上正在運行的 shell 命令中?

[英]How to insert a password or some other string into a running shell command on a Linux server using Paramiko?

我有一組服務器數據,我需要在它們上運行一系列命令

在命令seid keys add WALLET_NAME ,我需要輸入密碼,我該怎么做?

import paramiko
import time

def send_command(
        ip,
        username,
        password,
        monikername,
        walletname,
        nodepass,
        commands,
        short_pause = 1,
        long_pause = 5,
):
    cl = paramiko.SSHClient()
    cl.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    cl.connect(
        hostname=ip,
        username=username,
        password=password,
        look_for_keys=False,
        allow_agent=False,
    )
    with cl.invoke_shell() as ssh:
        for command in commands:
            ssh.send(f"{command}\n")
            ssh.settimeout(5)


if __name__ == "__main__":
    commands = [
        "sudo apt update && sudo apt upgrade -y",
        'ver="1.18.1" && \
        wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz" && \
        sudo rm -rf /usr/local/go && \
        sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz" && \
        rm "go$ver.linux-amd64.tar.gz" && \
        echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile && \
        source $HOME/.bash_profile && \
        go version',
        "git clone https://github.com/sei-protocol/sei-chain.git && cd sei-chain",
        "git checkout 1.0.6beta",
        "make install",
        "seid version --long | head",
        "seid init MONIKERNAME --chain-id atlantic-1",
        "seid keys add WALLET_NAME",
        "seid add-genesis-account WALLET_NAME 100000000usei",
        'seid gentx WALLET_NAME 100000000usei \
        --chain-id atlantic-1 \
        --commission-rate=0.1 \
        --commission-max-rate=0.2 \
        --commission-max-change-rate=0.1 \
        --pubkey $(seid tendermint show-validator) \
        --moniker "MONIKERNAME"',
        "cat ~/.sei/config/gentx/gentx-*"
    ]
    result = send_command(ip, username, password, monikername, walletname, nodepass,commands)
    print(result)

對於帶有服務器數據的數組,我執行這樣的循環

for key in data:
    ip = key['ip']
    username = key['username']
    password = key['pass']
    monikername = key['monikername']
    walletname = key['walletname']
    nodepass = key['nodepass']
    result = send_command(ip, username, password, monikername, walletname, 
    nodepass, commands)

您正在使用“shell”通道來執行命令。

shell是一個帶有輸入和輸出的黑盒。 因此,您不是“將密碼或其他字符串插入正在運行的腳本中” 您只是在 shell 中提供連續的輸入流。 從您的 API 的角度來看,輸入是命令還是命令的輸入幾乎無關緊要。 因此,命令輸入很容易成為“命令列表”中的另一個條目。

        "seid keys add WALLET_NAME",
        "password",

雖然請注意,使用“shell”通道自動執行命令是一種錯誤的方法。 請參閱Paramiko 上的 exec_command 和使用 invoke_shell() 發送有什么區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM