Chạy đầu ra của `ssh-agent` trong cá; `setenv` làm gì?


3

Khi tôi muốn bắt đầu (hoặc khởi động lại) ssh-agent, nó sẽ cho tôi một vài lệnh mà tôi nên chạy bằng cách thực hiện eval $(ssh-agent). Tất nhiên điều này không thành công cho cá, vì nó đưa ra cú pháp cho bash hoặc csh.

Các lệnh trông như:

SSH_AUTH_SOCK=/var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-L95xhmGl9FZo/agent.36846; export SSH_AUTH_SOCK;
SSH_AGENT_PID=36847; export SSH_AGENT_PID;
echo Agent pid 36847;

hoặc cho csh:

setenv SSH_AUTH_SOCK /var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-Tf8etHZfP9k3/agent.36873;
setenv SSH_AGENT_PID 36874;
echo Agent pid 36874;

Phiên bản csh chạy mà không có khiếu nại khi tôi làm eval (ssh-agent -c), và sau đó echo $SSH_AGENT_PID $SSH_AUTH_SOCKđưa ra đầu ra dự kiến. Tuy nhiên, shell mới không giữ các biến đó. Không gì setenvlàm gì? rõ ràng đó setlà biến số bằng cách nào đó, nhưng nó không có trong tài liệu. Nếu tôi bắt đầu một thiết bị đầu cuối mới, các biến bị mất, vì vậy tôi không chắc chúng được xuất?

Tôi chỉ thấy đó setenvlà một hàm cá, với định nghĩa set -gx, vì vậy tôi cho rằng nó đặt biến là một globalbiến và xuất nó. Tôi không hiểu rõ về phạm vi biến, vậy điều có thích hợp cho các ssh-agentbiến không?

Đối với ngữ cảnh, tôi đang làm điều này dựa trên các hướng dẫn tại github . Tôi đã sử dụng một chìa khóa ssh cho github trong nhiều năm và chưa bao giờ làm việc ssh-agenthoặc ssh-addchuyện, nhưng tôi nhận thấy nó trong khi thiết lập trên một máy tính mới. Có vẻ như os x đang tự chạy ssh-agent (hoặc một cái gì đó khác mà tôi đã thiết lập từ lâu), bởi vì $SSH_AUTH_SOCKđã tồn tại . Vì vậy, có thể chạy này không quan trọng? ssh-addkhông chạy mà không phàn nàn ngay cả khi không chạy ssh-agent.


Tại dấu nhắc cá, gõtype setenv
glenn jackman

Cảm ơn @glenn, tôi đã phát hiện ra rằng functions setenv, hãy xem bản chỉnh sửa của mình. typelà tốt, mặc dù. Nó dường như là một sự kết hợp của whichfunctions.
askewchan

Câu trả lời:


3

Tôi đã viết điều này một lúc trước:

function ssh_agent --description 'launch the ssh-agent and add the id_rsa identity'
    if begin
            set -q SSH_AGENT_PID
            and kill -0 $SSH_AGENT_PID
            and grep -q '^ssh-agent' /proc/$SSH_AGENT_PID/cmdline
    end
        echo "ssh-agent running on pid $SSH_AGENT_PID"
    else
        eval (command ssh-agent -c | sed 's/^setenv/set -Ux/')
    end
    set -l identity $HOME/.ssh/id_rsa
    set -l fingerprint (ssh-keygen -lf $identity | awk '{print $2}')
    ssh-add -l | grep -q $fingerprint
        or ssh-add $identity
end

Để nhấn mạnh, tôi sử dụng tạo các biến phổ quát từ đầu ra ssh-agent và setenv sẽ tạo các biến toàn cục


kill -0gì Tôi không thấy điều đó trong trang đàn ông. Và /prockhông tồn tại trên hệ thống của tôi (có thể os x không có nó).
askewchan

kill -0 pidtrả về thành công nếu pid đó là một quá trình đang chạy, lỗi khác. Tôi sử dụng /procđể kiểm tra xem một pid đang chạy có thực sự là một quá trình tác nhân ssh không: có nhiều cách khác để làm điều này (pgrep, phân tích cú pháp đầu ra ps)
glenn jackman

Điều này hoạt động trên mac os x nếu tôi thay đổi /proc/dòng thành:and ps -p $SSH_AGENT_PID | grep -q 'ssh-agent'
askewchan

1
Tôi khuyến nghị thay đổi mẫu grep thành '[s]sh-agent'để bạn không vô tình khớp chính lệnh grep trong đầu ra ps.
glenn jackman

Điều này hoạt động trên cygwin: P
Zardoz89

1

Điều này làm việc cho tôi trên FreeBSD 10.2. Thêm phần sau vào ~ / .config / fish / config.fish:

if begin; test -z (command pgrep ssh-agent); and not test -S $SSH_AUTH_SOCK; end
    eval (command ssh-agent -c | sed -E 's/^setenv (.+);$/set \1; set -Ux \1;/')
end

Tập đầu tiên, không có -Ux, đặt các biến môi trường cho thiết bị đầu cuối khởi chạy ssh-agent. Tập thứ hai, với -Ux, đặt các biến môi trường cho tất cả các thiết bị đầu cuối khác.


1

Cân nhắc sử dụng

cá_ssh_agent

Các chức năng tiện ích để bắt đầu đại lý ssh của bạn khi sử dụng vỏ cá. Bạn sẽ chỉ cần chạy ssh-add và nhập mật khẩu của bạn một lần, sau khi ssh_agent đang chạy sẽ thực hiện công việc cho bạn. Cần chạy một lần, các biến môi trường được chia sẻ giữa các phiên.

Cài đặt
wget https://gitlab.com/kyb/fish_ssh_agent/raw/master/functions/fish_ssh_agent.fish -P ~/.config/fish/functions/
Sử dụng
fish_ssh_agent

NGUỒN

Đặt cái này vào ~/.config/fish/functions/fish_ssh_agent.fish

function __ssh_agent_is_started -d "check if ssh agent is already started"
   if begin; test -f $SSH_ENV; and test -z "$SSH_AGENT_PID"; end
      source $SSH_ENV > /dev/null
   end

   if test -z "$SSH_AGENT_PID"
      return 1
   end

   ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep -q ssh-agent
   #pgrep ssh-agent
   return $status
end


function __ssh_agent_start -d "start a new ssh agent"
   ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
   chmod 600 $SSH_ENV
   source $SSH_ENV > /dev/null
   true  # suppress errors from setenv, i.e. set -gx
end


function fish_ssh_agent --description "Start ssh-agent if not started yet, or uses already started ssh-agent."
   if test -z "$SSH_ENV"
      set -xg SSH_ENV $HOME/.ssh/environment
   end

   if not __ssh_agent_is_started
      __ssh_agent_start
   end
end
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.