Tôi đã cố gắng giải quyết vấn đề này khi tôi đang tạo ra các bàn phím và lưu trữ chúng trong cơ sở dữ liệu bằng Python. Dưới đây là một số bước mà tôi đã sử dụng, cụ thể là bắt đầu ssh-agentvà tương tác với nó. Nó bằng Python, nhưng có lẽ bạn có thể dịch nó sang bất cứ thứ gì khác. Một tính năng khác là không ai trong số này sử dụng shell=True, vì vậy chúng an toàn hơn trước các cuộc tấn công tiêm chích.
import subprocess
import os
sockfile = '/some/place.sock'
agent = subprocess.Popen(['ssh-agent',
'-D', # foreground mode
'-a', sockfile, # bind address (socket file)
])
subprocess.check_call(['ssh-add',
'-D', # delete all identities from the agent
],
env={'SSH_AUTH_SOCK': sockfile},
)
Điều đó kích hoạt một ssh-agentchương trình chỉ dành cho chương trình của chúng tôi và xóa nó đi (tôi tin rằng nó đang tải khóa người dùng của tôi vào đó, không chắc chắn.) Biến môi trường SSH_AUTH_SOCKthường được đặt bởi ssh-agent(nhưng chúng tôi đã làm thủ công), chúng tôi đang cung cấp cho người khác các chương trình.
Tiếp theo chúng ta sử dụng ssh-addđể cung cấp cho nó khóa riêng (ở đây nó được lưu trữ dr.private_keydưới dạng một chuỗi, nhưng tôi cần tuần tự hóa nó, vì vậy tôi mã hóa nó thành ASCII).
adder = subprocess.Popen(['ssh-add',
'-', # read key from stdin
],
env={'SSH_AUTH_SOCK': sockfile},
stdin=subprocess.PIPE,
)
adder.communicate(dr.private_key.encode('ascii'))
retval = adder.wait()
assert retval == 0 # added successfully
Bây giờ bất cứ khi nào tôi sử dụng một số ứng dụng sử dụng SSH, ví dụ Git, tôi đều giới thiệu nó để sử dụng cùng một ổ cắm tác nhân SSH:
gitp = subprocess.Popen(
['git', '-C', os.path.abspath('../some-repo') ,'fetch'],
env={'SSH_AUTH_SOCK': sockfile},
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print(gitp.communicate()[0].decode('ascii'))
và nó hoạt động tốt "Tệp tạm thời" duy nhất là ổ cắm được sử dụng bởi ssh-agentnhưng nó được tạo để chỉ chủ sở hữu mới có quyền đối với nó và nó bị xóa khi bạn chấm dứt tác nhân.