我運行此命令為我的私有存盤庫生成有效的部署密鑰:
ssh-keygen -b 2048 -t rsa -C "mystring"
該命令提示我輸入路徑和密碼(我將其留空),并生成檔案。
答mykey:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
...
-----END OPENSSH PRIVATE KEY-----
還有一個mykey.pub:
ssh-rsa AAAAB3NzaC1yc...QDBQl mystring
但是如何在純 Ruby 中運行此命令并以字串形式獲取結果?
我努力了:
keypair = OpenSSL::PKey::RSA.new 2048
keypair.to_pem
keypair.public_key.to_s
但是生成的檔案與我得到的檔案不一樣ssh-keygen。
有誰知道如何做到這一點?
Ps 我找到了sshkey gem,但還沒有嘗試過,因為我寧愿避免為此使用 gem。
uj5u.com熱心網友回復:
使用內核呼叫 OpenSSH 實用程式
這是我認為不應該直接移植到 Ruby 的事情之一。雖然 OpenSSH 二進制檔案和源代碼會定期審核,但很少或很少使用的 Ruby gems 或 FFI 包裝器不會受到相同級別的審查。相反,您應該使用Kernel#system或Kernel#`呼叫或%x()子外殼文字,具體取決于您的用例。
從 Ruby 內部呼叫外部 SSH 實用程式
例如:
# Note that 3072 is currently the default size for RSA keys in
# OpenSSH. Also note that you can pass `-f path/to/keyfile` or
# `-P ""` for an empty passphrase if you don't use the `-A` flag.
system %(ssh-keygen -A -b 2048 -t rsa -C "mystring")
如果沒有該-f標志,您的 RSA 密鑰將被放入~/.ssh/id_rsa和 中~/.ssh/id_rsa.pub。然后,如果確實需要,您可以使用標準的 Ruby 方法來讀取檔案,盡管我想不出很多原因為什么您需要這樣做。
例如,要將您的公鑰讀入 Ruby 變數:
public_key = File.read "#{ENV['HOME']/.ssh/id_rsa.pub"
使用 SSH 代理
請注意,如果您已經在一個正在運行的程式中,如果您正在使用 SSH 代理,那么最大的挑戰將是使用 SSH 代理,因為此時環境變數和密鑰材料不太可能可用。但是,如果您愿意,您可以啟動代理并在當前會話中加載您的密鑰檔案。例如:
ssh_agent = %x(eval 'ssh-agent -s')
# assumes a passwordless key
system("ssh-add") && %x(ssh-add -l)
# Your agent's SSH_AUTH_SOCK is now exported by your current Ruby
# environment.
ENV['SSH_AUTH_SOCK']
# For some reason, SSH_AGENT_PID isn't exported properly. This may be
# user error on my part. Luckily, you can easily parse it out of the
# *ssh_agent* variable if needed.
ENV['SSH_AGENT_PID'] =
ssh_agent.match(/SSH_AGENT_PID=\d /).to_s.split(?=).last
安全注意事項
如果您在 macOS 或安裝了鑰匙串的 Linux 系統上運行,最好使用存盤在登錄鑰匙串中或在啟動 ssh-agent 時提示的密碼。無密碼密鑰有其一席之地,但有更安全的選項,在大多數現代系統上同樣易于管理。YMMV 基于您的確切用例。
也可以看看
有一個net-ssh gem也包含ssh-agent support。這是否適合您的需求或是否針對您的用例進行了充分審核取決于您。但是,不想自行推出或呼叫外部實用程式的其他訪問者應該知道此解決方案,并且可能還有其他人。同樣,您的里程可能會有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/392175.html
標籤:红宝石 ssh-keys opensh ssh-keygen 部署密钥
