Menjalankan ssh-agent dari skrip shell

19

Saya mencoba membuat skrip shell yang, antara lain, memulai ssh-agent dan menambahkan kunci pribadi ke agen. Contoh:

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

Masalahnya adalah ssh-agent tampaknya memulai $ SHELL (dalam kasus saya, bash) contoh lain dan dari perspektif skrip itu dijalankan segala sesuatu dan ssh-add dan apa pun di bawahnya tidak pernah berjalan.

Bagaimana saya bisa menjalankan ssh-agent dari skrip shell saya dan terus bergerak di bawah daftar perintah?

Dan
sumber

Jawaban:

8

ssh-agent seharusnya memulai sesi dan setelah selesai sesi pengguna berakhir. Jadi setiap perintah setelah ssh-agent mungkin akan dieksekusi setelah logoff.

Yang Anda inginkan adalah session-scriptperintah sesi yang berisi seperti ini:

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

Kemudian mulailah ssh-agent session-script.

Michael Suelmann
sumber
Terima kasih! Membuat skrip terpisah dan mengakhiri skrip dengan exitmelakukan trik.
Dan
2
apa itu skrip sesi?
Alexander Mills
15

Letakkan yang berikut di bagian atas skrip Anda:

eval `ssh-agent`

Script Anda akan terlihat seperti ini:

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

Penjelasan

Backticks di sekitar ssh-agentmengumpulkan outputnya. evalmengumpulkan output itu, menyatukannya menjadi satu perintah, dan kemudian mengeksekusi perintah. Kemudian Anda dapat menggunakan ssh-adduntuk memberikan kredensial utama Anda.

scottyseus
sumber
9
Ini adalah persis apa yang saya butuhkan, terima kasih, meskipun layak menunjukkan bahwa backticks sedang dalam perjalanan Dalam bentuk bash baru, seharusnyaeval $(ssh-agent)
sibaz
Solusi ini tidak bekerja untuk saya sampai saya meletakkan bash -idi akhir skrip.
Adolfo Correa
6

Saya cenderung melakukan sesuatu seperti ini dalam skrip yang membutuhkan agen.

#!/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.

Pada dasarnya hal pertama yang dilakukan skrip untuk memeriksa apakah agen berjalan. Jika tidak exec digunakan untuk memulai proses baru di tempat skrip. Agen dimulai, kunci ditambahkan, dan akhirnya, skrip dipanggil lagi (lihat $0).

Sakit kepala
sumber
Tapi itu tidak akan mempertahankan parameter skrip apa pun. Dan jika salah satu parameter memiliki spasi putih, tidak akan mudah untuk meneruskannya.
Denilson Sá Maia
3
Anda bisa menggunakan .. "ssh-add ; $0 $*", atau .. "ssh-add ; $0 $@"sebaliknya, yang mungkin berhasil. Yang tidak akan sempurna, tetapi pasti akan berhasil dalam banyak kasus. Solusi terbaik hampir selalu membuat agen Anda berjalan sebelum hal lain, ini hanya sesuatu yang mungkin berguna dalam kasus yang tidak jelas.
Zoredache
6

Saya menemukan ini bekerja untuk saya.

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

Saya membuat proses ssh-agent, menambahkan kunci, melakukan apa yang perlu saya lakukan, lalu membunuhnya. Tidak perlu memeriksa apakah itu berjalan nanti.

ditenagai uap
sumber
4

Lebih baik menggunakan gantungan kunci dalam hal ini

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Tambahkan .bashrc Anda yang berikut ini:

eval `keychain --eval id_rsa`
ZIADI Mohamed ali
sumber
Lebih baik? Kenapa lebih baik?
JFlo
@JFlo "Lebih Baik" di dalamnya, itu akan menyimpan variabel env ke $ HOME / .keychain / <file>. Menjalankan perintah itu lagi akan mengambil ssh-agent yang ada jika masih berjalan. Kemudian dapat digunakan kembali di antara shell / skrip. Dalam beberapa skenario yang tidak super aman, jadi Anda harus melakukan panggilan itu. Bagi saya, ini merupakan peningkatan dari beberapa skrip yang saya tulis untuk menyelesaikan tugas yang sama
Scott Carlson
2

Saya menemukan dengan solusi Zoredache, kuncinya akan tersedia untuk setiap shell yang kebetulan berbagi ssh-agent yang sama dengan shell yang disebut script. Saya ingin menghindari ini dalam skrip yang membutuhkan akses root ke mesin jarak jauh, untuk alasan keamanan yang jelas.

Saya menemukan menempatkan shebang berikut di bagian atas naskah berfungsi:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
Andy Wood
sumber
-2

Saya sudah mencoba dan banyak dan solusi yang akhirnya berhasil adalah mengganti kata sandi saya dengan string kosong.

ssh-keygen -p
Stephan Weinhold
sumber
Ini adalah praktik yang sangat tidak aman. Kenapa repot-repot menggunakan ssh? Jika Anda tidak melindungi kunci pribadi Anda, Anda mungkin juga berbicara dalam teks yang jelas.
JFlo
@ JFlo: tidak jika sistem klien Anda cukup aman, mungkin saja itu. Terutama jika Anda (dapat dan tidak) menambahkan ACL, SELinux, atau yang serupa, yang mudah dengan file statis tetapi lebih sedikit dengan soket acak ssh-agent. Yang mengatakan saya biasanya tidak merekomendasikan ini sebagai pilihan pertama.
dave_thompson_085
Meskipun itu adalah proses yang sangat membantu yang Anda berikan, saya tidak berpikir itu menjawab apa pun tentang pertanyaan OP.
Alexander Bird