![](/img/trans.png)
[英]Use Expect in a Bash script to provide a password to an SSH command
[英]Provide password to ssh command inside bash script, Without the usage of public keys and Expect
我想在腳本中使用SSH
,但該腳本不會在我的機器上執行。
在我的實現中有兩個限制。
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_ASKPASS
和DISPLAY
setsid
ssh
hostname
saypass
以獲取密碼farcommand
(如果給定)或交互式 shell。 我通常使用date
或hostname
來測試可選的farcommand
。
有很多地方會出錯。
訣竅是標准的 Linux 命令行ssh
有幾個環境變量,您可以使用它們來選擇執行以提供密碼的程序。
ssh(1)
手冊頁說:
SSH_ASKPASS
如果ssh
需要密碼,如果它是從終端運行的,它將從當前終端讀取密碼。 如果ssh
沒有與之關聯的終端,但設置了DISPLAY
和SSH_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
,即ssh
之上的復制程序:
SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .
真的不要使用這個,除非在可怕的、可怕的情況下,比如你有數百台計算機並且你不能安裝任何東西,比如 ssh 密鑰, sshpass
甚至expect
。
如果您確實使用了它,請不要告訴任何人我告訴過您如何使用它。 這真的很可怕。
我不知道手冊頁關於“打開 X11 窗口”是什么意思,在我的測試中沒有發生這樣的事情。
經過測試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.