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-agent
và 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-agent
chươ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_SOCK
thườ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_key
dướ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-agent
như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.