Bir kabuk komut dosyasından ssh-agent'ı çalıştırma


19

Diğer şeylerin yanı sıra, ssh-agent başlatan ve ajana özel bir anahtar ekleyen bir kabuk komut dosyası oluşturmaya çalışıyorum. Misal:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Bu sorun ssh-ajan görünüşe göre $ SHELL (benim durumumda bash) başka bir örneğini başlattı ve komut dosyasının bakış açısından her şeyi ve ssh-add yürütülür ve altındaki hiçbir şey asla çalıştırılmaz.

Kabuk betiğimden ssh-agent'ı nasıl çalıştırabilir ve komutlar listesinde aşağı doğru hareket ettirebilirim?

Yanıtlar:


8

ssh-agent'ın bir oturum başlatması gerekir ve bittiğinde kullanıcı oturumu sona erer. Yani ssh-agent'dan sonraki herhangi bir komut oturumdan sonra belki de çalıştırılır.

İstediğiniz, bunun session-scriptgibi oturum komutlarınızı içeren bir :

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Sonra başlayın ssh-agent session-script.


Teşekkürler! Ayrı bir komut dosyası oluşturmak ve komut dosyasını sonlandırmak exithile yaptı.
Dan

2
oturum betiği nedir?
Alexander Mills

15

Aşağıdakileri komut dosyanızın üstüne koyun:

eval `ssh-agent`

Senaryonuz şöyle görünmelidir:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

açıklama

Etraftaki backticks ssh-agentçıktısını toplar. evalbu çıktıyı toplar, tek bir komutta birleştirir ve ardından komutu yürütür. Ardından ssh-add, anahtar kimlik bilgilerinizi sağlamak için kullanabilirsiniz .


9
Bu tam olarak ihtiyacım olan şey, teşekkürler, geri dönüşlerin çıkış yolunda olduğunu belirtmeye değer. Yeni bash formunda olmalıeval $(ssh-agent)
sibaz

Ben bash -isenaryo sonuna kadar bu çözüm benim için işe yaramadı .
Adolfo Correa

6

Ben bir ajan gerektiren senaryolarda böyle bir şey yapmak eğilimindedir.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

Temel olarak komut dosyasının yaptığı ilk şey, bir ajanın çalışıp çalışmadığını kontrol eder. Exec değilse komut dosyası yerine yeni bir işlem başlatmak için kullanılır. Aracı başlatılır, anahtarlar eklenir ve son olarak komut dosyası yeniden çağrılır (bkz. $0).


Ancak bu herhangi bir komut dosyası parametresini korumaz. Parametrelerin herhangi birinde boşluk varsa, bunları iletmek kolay olmayacaktır.
Denilson Sá Maia

3
Kullanabilir .. "ssh-add ; $0 $*"veya .. "ssh-add ; $0 $@"bunun yerine işe yarayabilir. Bu mükemmel olmaz, ancak birçok durumda kesinlikle işe yarar. En iyi çözüm, neredeyse her zaman ajanınızın başka bir şeyden önce çalışmasını sağlamaktır, bu sadece belirsiz durumlarda yararlı olabilecek bir şeydir.
Zoredache

6

Bunun benim için işe yaradığını buldum.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Ssh-agent işlemini yaratıyorum, anahtarı ekliyorum, yapmam gerekeni yapıyorum, sonra öldürüyorum Daha sonra çalışıp çalışmadığını kontrol etmeye gerek yok.


4

Bu durumda anahtarlık kullanmak daha iyidir

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

.Bashrc'nize aşağıdakileri ekleyin:

eval `keychain --eval id_rsa`

Daha iyi? Neden daha iyi?
JFlo

@JFlo "Daha iyi", env değişkenlerini $ HOME / .keychain / <file> 'a kaydedecektir. Bu komutu tekrar çalıştırmak, hala çalışıyorsa mevcut bir ssh aracısını alır. Daha sonra kabuklar / komut dosyaları arasında yeniden kullanılabilir. Süper güvenli olmayan bazı senaryolarda, bu çağrıyı yapmanız gerekir. Benim için, aynı görevi yerine getirmek için yazdığım bazı senaryolara göre bir gelişme
Scott Carlson

2

Zoredache'ın çözümü ile buldum, anahtar, komut dosyasını çağıran kabukla aynı ssh-ajanını paylaşan herhangi bir kabuk için mevcut olacaktı. Açık güvenlik nedenlerinden ötürü, uzak bir makineye kök erişimi gerektiren bir komut dosyasında bundan kaçınmak istedim.

Senaryo çalışmaları üstünde aşağıdaki shebang koyarak buldum:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

Denedim ve çok ve sonunda çalışan çözüm benim parolamı boş bir dize ile değiştirilmesi oldu.

ssh-keygen -p

Bu çok güvensiz bir uygulamadır. Neden ssh kullanmayı hiç rahatsız etmiyorsun? Özel anahtarınızı korumazsanız, açık metinlerle de konuşabilirsiniz.
JFlo

@JFlo: istemci sisteminiz yeterince güvenliyse değil, olabilir. Özellikle, ACL, SELinux veya benzerlerini (statik bir dosya ile kolay ancak ssh-agent'ın rastgele soketi ile daha az eklerseniz (yapabilir ve yapabilirsiniz). Bu genellikle ilk seçim olarak tavsiye olmaz dedi.
dave_thompson_085

Sağladığınız çok yararlı bir süreç olsa da, OP'nin sorusu hakkında hiçbir şeye cevap vermediğini sanmıyorum.
Alexander Bird
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.