Có cách nào thuận tiện để đảm bảo rằng tất cả thông tin đăng nhập từ một người dùng nhất định (ví dụ như tôi) sử dụng cùng một ssh-agent không? Tôi đã hack một kịch bản để làm cho công việc này hầu hết thời gian, nhưng tôi nghi ngờ rằng có một số cách để làm nó mà tôi vừa bỏ lỡ. Ngoài ra, kể từ thời điểm đó, đã có những tiến bộ đáng kinh ngạc trong công nghệ điện toán, ví dụ như trang web này.
Vì vậy, mục tiêu ở đây là
- Bất cứ khi nào tôi đăng nhập vào hộp, bất kể là thông qua SSH hay trong phiên đồ họa bắt đầu từ gdm / kdm / etc hoặc tại bảng điều khiển:
- nếu tên người dùng của tôi hiện không
ssh-agent
chạy, một tên được khởi động, các biến môi trường được xuất vàssh-add
được gọi. - mặt khác, tọa độ của tác nhân hiện có được xuất trong các biến môi trường của phiên đăng nhập.
- nếu tên người dùng của tôi hiện không
Cơ sở này đặc biệt có giá trị khi hộp trong câu hỏi được sử dụng làm điểm chuyển tiếp khi ssh
đưa vào hộp thứ ba. Trong trường hợp này, nó tránh phải nhập cụm mật khẩu của khóa riêng mỗi khi bạn ssh vào và sau đó muốn, ví dụ, làm git push
hoặc làm gì đó.
Kịch bản được đưa ra dưới đây thực hiện điều này một cách đáng tin cậy, mặc dù nó đã bị hỏng gần đây khi X bị sập và sau đó tôi bắt đầu một phiên đồ họa khác. Có thể đã có sự sai lầm khác xảy ra trong trường hợp đó.
Đây là kịch bản xấu của tôi là tốt. Tôi nguồn này từ của tôi .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Xin vui lòng cho tôi biết có một cách tốt hơn để làm điều này. Ngoài ra, vui lòng không cắt xén những mâu thuẫn / gaffes (ví dụ: bỏ var
đồ vào etc
); Tôi đã viết điều này một thời gian trước đây và từ đó đã học được nhiều điều.