đại lý ssh và màn hình


8

Một thời gian trước trên StackOverflow, tôi đã hỏi câu hỏi này về ssh-agent và crontab . Bây giờ tôi có một câu hỏi tương tự về ssh-agent và màn hình trên các hệ thống linux.

Vì vậy, trên máy Mac của tôi, ssh-agent khởi chạy khi khởi động hệ thống, vì vậy nó luôn có sẵn cho tôi. Tôi nghĩ nó sẽ đúng với linux của tôi (redhat el5 / fedora) nếu tôi đang sử dụng X-Windows. Tuy nhiên, đây là một máy chủ từ xa và tôi luôn đăng nhập qua ssh.

Tôi rất thích cài đặt khóa ssh đúng cách để tôi không phải nhập mật khẩu nhiều lần trong khi cập nhật hoặc cam kết svn. Tôi rất vui khi nhập cụm mật khẩu của mình một lần mỗi phiên và tôi không khuyến khích nhóm của chúng tôi có khóa ssh-mật khẩu.

Trong một khoảnh khắc tỏa sáng ngắn ngủi, có vẻ như thực hiện "eval` ssh-agent -s`" trong .bash_profile của tôi, kết hợp với một lệnh để giết tác nhân ssh khi tôi đăng xuất, sẽ hoạt động. Tuy nhiên, chúng tôi sử dụng màn hình nhiều để quản lý các chương trình tương tác và môi trường phát triển dài hạn. Nếu bạn bắt đầu và dừng ssh-agent như tôi vừa mô tả, thì nó sẽ bị giết khi bạn thoát ra khỏi thiết bị đầu cuối và các phiên con của màn hình được sử dụng để đề cập đến cá thể ssh-agent đó bị bỏ qua.

Vậy ... làm thế nào tôi có thể là người dùng bảng điều khiển, người sử dụng màn hình, người sử dụng mật khẩu với các phím ssh của mình, người không phải gõ cụm mật khẩu liên tục?

Câu trả lời:


4

Với thiết lập sau, bạn sẽ không cần bất kỳ trình bao bọc nào để gọi screen. Hơn nữa, nó tránh sử dụng /tmp(với các rủi ro bảo mật do đó).

  1. Đảm bảo bạn có thư mục ~ / tmp:

    mkdir ~/tmp
    
  2. Thêm vào .screenrcdòng sau:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • Điều này đảm bảo rằng bên trong screen, sshtìm ổ cắm luôn ở cùng một vị trí, thay vì đường dẫn thay đổi.
    • Bạn phải sử dụng setenvbất kỳ shell nào bạn sử dụng, vì đó là màn hình chứ không phải lệnh shell.
  3. Thêm vào .bash_profiledòng sau:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • Điều này sẽ liên kết từ vị trí cố định (nơi sshtrông) đến vị trí thực và phải xuất hiện sau khi bắt đầu ssh-agent.
    • Sử dụng [ -n "$SSH_AUTH_SOCK" ]sẽ ngăn chặn đúng lỗi khi SSH_AUTH_SOCKkhông được đặt.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]sẽ ngăn các phiên màn hình liên kết màn hình $ HOME / tmp / ssh-agent-màn hình với chính nó, nếu nguồn màn hình .bash_profile.
  4. Thay vì bắt đầu ssh-agentvào .bash_profile, bạn có thể xem xét việc kết nối với ssh -A(để sử dụng đại lý giao nhận và làm cho máy sử dụng từ xa đại lý của bạn).

Sau khi thiết lập này, bạn chỉ có thể sử dụng lệnh màn hình tiêu chuẩn. Bạn sẽ chỉ cần tạo lại các phiên hiện có hoặc đặt thủ công SSH_AUTH_SOCK bên trong chúng đến vị trí cố định của bước 2.

Tín dụng cho trang web này cho ý tưởng; Tôi tránh sử dụng /tmp. Câu trả lời này tương tự nhưng sử dụng thêm bí danh.


2

Bạn có thể khởi chạy ssh-agent từ một bản initscript .bash_profilekhông? Ví dụ, tôi có thể đặt

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

trong phần thích hợp của /etc/conf.d/local, mặc dù RHEL / Fedora có thể sử dụng một hệ thống khác. Như bạn đã chỉ ra trong nhận xét của mình, các phiên cuối sẽ cần có khả năng kết nối với tác nhân, đó là lý do tại sao lệnh đó tạo tệp .ssh_agent_envtrong thư mục chính của người dùng. Sau đó, bạn có thể thêm

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

trong .bash_profile.

Một điều khác bạn có thể làm là đưa những điều sau vào .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

Nó sẽ ssh-agentchỉ bắt đầu nếu nó chưa chạy. Sau đó, bạn không phải giết nó.

Là một thay thế hơi khác so với đề xuất thứ hai, thay vì kiểm tra sự tồn tại của một ssh-agentquy trình, bạn có thể kiểm tra sự tồn tại của tệp ~/.ssh_agent_env,

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

Nếu mọi thứ hoạt động đúng, không nên có bất kỳ sự khác biệt đáng kể nào giữa hai cách.


Ý tưởng initscript rất thú vị - về cơ bản, chỉ cần khởi động nó khi khởi động hệ thống cho tất cả người dùng muốn nó? Điều đó có thể làm việc. Chúng tôi không có nhiều người dùng quan tâm. Có hay không điều đó tốt hơn đáng kể so với việc không có cụm mật khẩu hay không là một câu hỏi thú vị, vì tôi nghi ngờ điều đó có nghĩa là bạn chỉ phải nhập nó một lần cho mỗi lần khởi động lại máy. Hừm. Cả đề xuất đó và đề xuất thứ hai đều dựa vào các phiên thiết bị đầu cuối mới có thể kết nối với tác nhân ssh nếu nó đang chạy. Tôi không hoàn toàn chắc chắn rằng nó dễ dàng, nhưng tôi chưa thử. Cảm ơn các ý tưởng!
Michael H.

@khedron: Đúng, nhưng bạn phải đặt một dòng /etc/conf.d/local(hoặc tương đương) cho mỗi người dùng sử dụng tác nhân, để khởi chạy một ssh-agentquy trình riêng cho mỗi người dùng. Nếu, như bạn nói, bạn không có một số lượng lớn người dùng, điều đó sẽ không quá tệ. Bạn nêu lên một điểm tốt (mà tôi quên xem xét) về các phiên cuối gắn với đại lý; xem chỉnh sửa của tôi để trả lời.
David Z

2

Kiểm tra móc khóa . Nó làm tất cả những điều trên. Nhìn đặc biệt vào --clear--timeoutcác tùy chọn.


2

Một cách tiếp cận tốt hơn là sử dụng chuyển tiếp tác nhân ssh ( -Atùy chọn). Điều này cho phép người sử dụng ssh sử dụng các khóa từ tác nhân ssh đang chạy trên máy mà họ đến từ đó, có lẽ là máy trạm mà họ đang ngồi.


Điều này cũng cho phép kẻ tấn công xâm phạm tài khoản của bạn để thỏa hiệp tài khoản trên các máy khác mà đại lý đó có thể truy cập. Do đó tôi cố gắng giữ cho đại lý ssh chuyển tiếp đến mức tối thiểu.
Paul Giá

2

để theo dõi chuyển tiếp đại lý ssh, bạn sẽ thấy rằng theo mặc định, thông tin đăng nhập ssh được chuyển tiếp sẽ không khả dụng cho phiên màn hình của bạn sau khi bạn đăng xuất, đăng nhập lại và đính kèm lại vào sesssion của bạn.

Tuy nhiên, bạn có thể giải quyết vấn đề này bằng cách đặt màn hình biến môi trường SSH_AUTH_SOCK thành một cái gì đó nổi tiếng và có vị trí nổi tiếng đó được cập nhật vào ổ cắm xác thực hiện tại của bạn.

Tôi sử dụng chức năng shell này để vào lại màn hình và sửa lỗi ssh auth sock:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

và tôi có cái này trong .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

Hi vọng điêu nay co ich.


Sử dụng / tmp có nghĩa là bất kỳ ai khác trên máy đều có thể ghi đè bất kỳ tệp nào của bạn, nếu anh ta biết đường dẫn của họ.
Blaisorblade

1

Nếu tôi hiểu bạn đúng, bạn chỉ muốn một phiên màn hình, đôi khi bạn tách ra và gắn lại nhưng không bao giờ muốn nhập lại mật khẩu cho tác nhân ssh (mật khẩu khóa riêng của bạn).

Tôi nghĩ cách dễ nhất là bắt đầu màn hình, hơn là khởi động ssh-agent với shell phụ và sau đó ở trong shell phụ đó. I E

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running

Đó thực chất là những gì tôi làm. Tôi sử dụng màn hình để gắn nhãn một trong các "tab" bên trong là có quyền hạn ssh-agent và sử dụng nó cho svn hoạt động, v.v. Có một nếp nhăn thêm khi tôi buộc ssh-agent phải ủy quyền lại sau một vài giờ, nhưng yup, về cơ bản đây là nơi tôi đang ở.
Michael H.
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.