簡體   English   中英

在 bash 腳本中為 ssh 命令提供密碼,無需使用公鑰和 Expect

[英]Provide password to ssh command inside bash script, Without the usage of public keys and Expect

我想在腳本中使用SSH ,但該腳本不會在我的機器上執行。

在我的實現中有兩個限制。

  • 我不能在 shell 的標准之外工作,因此我不能使用expect因為我不知道它是否可以在這台機器上使用。
  • 我不能指望這台機器會有SSH public keys

可能的選項-解決方案是什么?

如何在不添加額外依賴項的情況下以自動且安全的方式向 ssh 提供請求的密碼?

是否可以在腳本中提供密碼?

謝謝大家 :)

安裝 sshpass,然后啟動命令:

sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no yourusername@hostname

出於安全原因,您必須避免在命令行上提供密碼,否則任何運行 ps 命令的人都可以看到您的密碼。 好像這樣使用sshpass實用程序:

#!/bin/bash

export SSHPASS="your-password"
sshpass -e ssh -oBatchMode=no sshUser@remoteHost

您可能對如何使用 Bash 腳本中的密碼運行 sftp 命令感興趣

首先:除非您知道為什么這樣做是安全的(即您已經評估了知道該秘密的攻擊者可以造成什么損害),否則不要將秘密放在明文中

如果您可以將機密放入腳本中,則可以隨附一個 ssh 密鑰並在ssh-agent shell 中執行:

#!/usr/bin/env ssh-agent /usr/bin/env bash
KEYFILE=`mktemp`
cat << EOF > ${KEYFILE}
-----BEGIN RSA PRIVATE KEY-----
[.......]
EOF
ssh-add ${KEYFILE}

# do your ssh things here...

# Remove the key file.
rm -f ${KEYFILE}

使用 ssh 密鑰的一個好處是您可以輕松地使用強制命令來限制密鑰持有者可以在服務器上執行的操作。

更安全的方法是讓腳本運行ssh-keygen -f ~/.ssh/my-script-key來創建專用於此目的的私鑰,但是您還需要一個例程來將公鑰添加到服務器。

AFAIK 除了使用密鑰之外沒有其他可能性,或者如果您使用命令行版本ssh 但是對於大多數編程語言(如 C、python、php 等)都有庫綁定。 你可以用這種語言編寫程序。 這樣就可以自動傳遞密碼。 請注意,這當然是一個安全問題,因為密碼將在該程序中以純文本形式存儲

我完全同意每個人都說這幾乎肯定是一個糟糕的主意 極有可能允許他人攻擊您的計算機。

在評估安全隱患后自行承擔使用風險

回答

制作一個輸出密碼的程序/path/to/saypass ,例如

#!/bin/sh
echo 'secret'

使其可執行

chmod +x /path/to/saypass

然后這是主要命令:

SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [farcommand]

  • 設置兩個環境變量SSH_ASKPASSDISPLAY
    • 然后運行setsid
      • 然后在沒有控制終端的情況下運行ssh
        • 連接到遠hostname
        • ...在本地運行saypass以獲取密碼
        • ... 告訴遠端服務器
        • ...並假設它是正確的
          • 然后運行farcommand (如果給定)或交互式 shell。

我通常使用datehostname來測試可選的farcommand

有很多地方會出錯。

解釋

訣竅是標准的 Linux 命令行ssh有幾個環境變量,您可以使用它們來選擇執行以提供密碼的程序。

ssh(1)手冊頁說:

SSH_ASKPASS如果ssh需要密碼,如果它是從終端運行的,它將從當前終端讀取密碼。 如果ssh沒有與之關聯的終端,但設置了DISPLAYSSH_ASKPASS ,它將執行SSH_ASKPASS指定的程序並打開 X11 窗口以讀取密碼。

所以:您需要一個程序(shell 腳本或任何其他類型)來輸出密碼。 然后你需要說服ssh使用它:

  • SSH_ASKPASS設置為/path/to/saypass
  • DISPLAY設置為愚蠢的東西
  • 沒有控制終端(這就是setsid所做的)

您將其放在以下sh命令中:

SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [command]

ssh將執行

/path/to/saypass "username@hostname's password:"

指紋檢查

如果需要指紋,您通常會在此處看到消息

The authenticity of host '*hostname* (*ipaddress*)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? 

然后ssh會像這樣運行你的命令:

/path/to/saypass "Please type 'yes' or 'no':"

一機多用的腳本

以下是用於在主腳本中創建、使用和刪除saypass腳本。 每個人都會告訴您不要將明文密碼放在文件中,也不要對密碼進行硬編碼 他們有充分的理由告訴你:這會給你帶來很多麻煩。 使用風險自負。

#!/bin/sh

echo "#!/bin/sh\necho 'secret';rm -f /tmp/saypass.$$" > /tmp/saypass.$$
chmod 775 /tmp/saypass.$$
SSH_ASKPASS="/tmp/saypass.$$" DISPLAY=anything setsid ssh "$@"

SCP

這也適用於scp ,即ssh之上的復制程序:

SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .

警告

真的不要使用這個,除非在可怕的、可怕的情況下,比如你有數百台計算機並且你不能安裝任何東西,比如 ssh 密鑰, sshpass甚至expect

如果您確實使用了它,請不要告訴任何人我告訴過您如何使用它。 這真的很可怕。

我不知道手冊頁關於“打開 X11 窗口”是什么意思,在我的測試中沒有發生這樣的事情。

經過測試

  • OpenSSH_6.6.1p1 Ubuntu-2ubuntu2,OpenSSL 1.0.1f 2014 年 1 月 6 日在 Ubuntu 14.04.1 LTS 上,
  • OpenSSH_7.2p2 Ubuntu-4ubuntu2.1、OpenSSL 1.0.2g 2016 年 3 月 1 日在 Ubuntu 16.04.2 LTS 上
  • OpenSSH_7.6p1 Ubuntu-4ubuntu0.3、OpenSSL 1.0.2n 2017 年 12 月 7 日在 Ubuntu 18.04.5 LTS 上

暫無
暫無

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

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