Tại sao ssh-agent lưu khóa không được mã hóa của tôi để sử dụng sau này?


12

Mỗi lần tôi SSH vào một máy chủ khác từ máy chủ Ubuntu không đầu của chúng tôi, tôi được yêu cầu nhập mật khẩu vào tệp chính của mình. Ngay cả khi trước đây tôi đã kết nối với máy chủ.

Bạn có biết tại sao điều này có thể? Nó có thể là một cái gì đó đơn giản như ssh-agenthiện không chạy hoặc một cái gì đó.

Khóa tương tự trên máy tính để bàn Ubuntu Gnome của tôi đang hoạt động tốt. Cả máy chủ và máy tính để bàn đều chạy Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent

1
Đầu tiên, như bạn đã nói, hãy kiểm tra xem có ssh-agentđang chạy hay không:ps -ef | grep '[s]sh-agent'
Scott Severance

@mssever Yep nó có vẻ là. Xem câu hỏi cập nhật.
Treffynnon

Câu trả lời:


10

Ngay cả khi tác nhân lên, nếu các biến môi trường nhất định không được đặt, bạn không có tham chiếu đến tác nhân. Hơn nữa, ngay cả khi tất cả đều ổn, tác nhân và biến, danh tính không được tự động gửi đến tác nhân: đó là một nhiệm vụ ssh-askpass, chỉ hoạt động trong các phiên X.

Nếu bạn đang sử dụng bash, hãy tạo tệp ~/.bash_profilecó nội dung này:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

sửa đổi tên tệp ~/.ssh/id_dsatheo nhu cầu của bạn và thêm dòng này vào~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Lưu ý cuối cùng: điều này không can thiệp vào phiên gnome, vì trong trường hợp đó chỉ ~/.profilecó nguồn gốc và bạn có thể hưởng lợi từ ssh-askpassgiao diện đồ họa yêu cầu cụm mật khẩu và gửi nó đến ssh-agent.


Cảm ơn @enzotib nó hoạt động rất tốt để sshing vào các máy khác. Nhưng nó không khi sử dụng gitđể đẩy hoặc kéo vào một kho lưu trữ công cộng. Bạn có bất cứ ý tưởng làm thế nào tôi có thể giải quyết điều đó là tốt?
Treffynnon

Thêm một chức năng giống với ssh(), gọi nó git()và thay đổi dòng cuối cùng từ /usr/bin/sshđến /usr/bin/git. Ngoài ra, thêm một dòng cuối cùng với export -f git.
enzotib

@enzotib Tôi đã thử điều đó, nhưng bây giờ khi tôi sshvào máy với bash_profiletệp bạn đã tạo ở trên, nó sẽ hỏi tôi mật khẩu của khóa. Vì một số lý do bây giờ mỗi khi tôi ssh trong nó hỏi ngay cả trước khi tôi đã thực thi sshhoặc git. Xem gist.github.com/942082 để biết lời nhắc tôi quay lại khi đăng nhập vào máy vi phạm.
Treffynnon

@Treffynnon: Tôi không biết chính xác cách gittương tác sshvà tôi không sử dụng gitđể tôi không thể thử. Tôi đã sửa đổi ~/.bash_profileđể bao gồm các git()chức năng tôi đã đề cập ở trên, để chắc chắn rằng lời giải thích trước đây của tôi là rõ ràng. Ngoài ra, có vẻ như từ đầu ra mà bạn cho thấy rằng bạn đã sửa đổi máy chủ, nhưng tất cả các lời khuyên của tôi chỉ được chuyển đến máy khách.
enzotib

@enzotib Đúng vậy. Máy chủ mà tôi đăng nhập trở thành máy khách của tôi khi tôi gitđẩy vào một trung tâm giả mạo / kho lưu trữ từ đó để tập tin được đặt đúng chỗ. Tôi nghĩ rằng bạn vừa cho tôi gợi ý / chạy bộ suy nghĩ của tôi. Tôi có một dấu nhắc bash đặc biệt hiển thị nhánh git của pwd. Tôi cá rằng đó là những gì đang kích hoạt yêu cầu mật khẩu khi đăng nhập bash khi nó cố gắng git stat trước khi hiển thị dấu nhắc bash!
Treffynnon

2

Gần đây tôi đã bắt đầu sử dụng ssh-nhận dạng:

https://github.com/ccontavalli/ssh-ident

tất cả những gì bạn phải làm là thêm một cái gì đó như:

alias ssh="/path/to/ssh-ident"

trong của bạn .bashrc. Ngoài ra, bạn có thể ln -s /path/to/ssh-ident ~/bin/sshhoặc một số thư mục khác trong PATH của bạn trước /bin/usr/bin.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.