Ini adalah masalah yang sudah lama saya alami, tetapi setiap kali saya mencoba untuk mencari tahu saya tersesat, jadi saya pikir saya sebaiknya bertanya di sini di mana mungkin seseorang yang lebih berpengalaman dapat membantu saya.
Latar Belakang
Raspberry Pi saya menjalankan Raspbian Jessie, dan saya sering menggunakan SSH untuk masuk ke dalamnya dan menjalankan perintah dari jarak jauh. Selama sesi SSH pertama saya, saya perhatikan bahwa suatu ssh-agent
proses muncul pada RPi setiap kali saya login, tetapi tidak pernah terbunuh ketika exit
: masuk dan keluar beberapa kali menyebabkan banyak ssh-agent
proses yang muncul hanya untuk dibiarkan menggantung di sana tidak melakukan apa-apa. Mengotak-atik dan membaca halaman manual dan jawaban di sana-sini, saya baru-baru ini memahami tujuan ssh-agent
, dan saya juga belajar bahwa itu seharusnya terbunuh ketika logout, jadi saya mulai bertanya pada diri sendiri mengapa tidak. Lebih jauh, saya perhatikan bahwa penerbitan source ~/.bashrc
menyebabkan turunan lain ssh-agent
. Saya membaca di halaman manual relatifbahwa variabel lingkungan SSH_AGENT_PID
harus didefinisikan karena ssh-agent
program harus dimulai di dalam eval
untuk mengeksekusi output dan mendefinisikan variabel-variabel tersebut, yang kemudian digunakan oleh perintah terkait SSH lainnya, termasuk ssh-agent -k
(untuk membunuh agen relatif terhadap sesi saat ini), jadi saya berlari echo $SSH_AGENT_PID
dan echo $SSH_AUTH_SOCK
, tetapi mereka berdua kosong. Tiba-tiba saya menyadari: mungkin prosesnya tidak terbunuh saat keluar karena ssh-agent -k
mencoba membaca PID-nya dari variabel lingkungan yang tidak disetel.
Masalah
Karena ssh-agent
tidak terbunuh saat keluar, dan ini pasti terjadi karena variabel lingkungan yang diperlukan tidak disetel, itu hanya dapat berarti satu hal: siapa pun yang memanggil ssh-agent
masuk mungkin tidak melakukannya dengan cara yang benar (yang akan menjadi eval "$(ssh-agent -s)"
) . Jadi saya berpikir: apa masalahnya? Saya hanya akan menemukan file konfigurasi, layanan, atau skrip login mana saja yang dijalankan untuk memulai agen dan memperbaikinya secara manual! Di mana di bumi ini?
Apa yang saya coba
Karena saya perhatikan bahwa sebuah ssh-agent
menelurkan setiap kali saya menelepon source ~/.bashrc
, ini adalah file pertama yang saya periksa, tetapi tidak ada bahkan di sana yang mereferensikan apa pun yang berhubungan dengan SSH. Saya terus mencari menggunakan vi
string ssh
di dalam semua file berikut, tetapi tidak menemukan apa pun :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
Apakah ada beberapa file lagi yang bisa terlibat source ~/.bashrc
? Saya tidak begitu tahu.
Kemudian saya mencari systemd
layanan yang relevan , tetapi hanya menemukan ssh.service
, yang WantedBy=multi-user.target
, dan karena itu tidak berjalan saat login (dan yah, itu jelas karena ini adalah daemon server SSH).
Saya juga mencoba memindahkan setiap file di /home/pi
folder saya ke folder sementara dan keluar dan kembali lagi, tetapi ssh-agent
masih muncul.
Akhirnya, saya juga menembakkan tembakan terakhir yang saya miliki di kamar: Saya berlari find / -name 'ssh-agent'
sebagai root, yang hanya dicetak /usr/bin/ssh-agent
, yang dapat dieksekusi, jadi saya membuat executable palsu yang pada dasarnya hanya mencatat perintah induk :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Saya mengganti nama yang asli /usr/bin/ssh-agent
dan menggantinya dengan yang palsu mengatur hak akses / pengguna / grup, berlari source ~/.bashrc
lagi, lalu mencetak LOG
file:
-bash
-bash
Tidak ada satu pun petunjuk tentang apa yang sedang terjadi.
Lebih detail
Saya menambahkan beberapa detail lagi, saya tidak tahu apakah itu bisa membantu atau tidak, tetapi Anda tahu ... lebih aman daripada menyesal.
Ini milik saya
.bashrc
.Saya membuat pengguna baru bernama
dummy
menggunakanuseradd -m dummy
, dan masuk ke dalamnya tidak memulai apa punssh-agent
(saya merasa ini bisa berarti sesuatu). Thediff /home/pi/.bashrc /home/dummy/.bashrc
show pada dasarnya tidak ada (hanya komentar saya membuat), yang sama untukdiff /home/pi/.profile /home/dummy/.profile
.Soket agen dibuat tanpa masalah meskipun
SSH_AUTH_SOCK
tidak disetel:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
Tidak yakin mengapa, tetapi nomor pada nama file soket selalu yang tepat sebelum PID
ssh-agent
proses.Cuplikan dari
htop
:PID USER PRI NI VIRT RES SHR S Command 1 root 20 0 5472 3900 2728 S /sbin/init 1329 pi 20 0 3696 224 16 S └─ ssh-agent -s
Paket terinstal yang cocok
ssh
:pi:~$ apt list --installed | grep ssh libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed] libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic] libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic] openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed] sshpass/oldstable,now 1.05-1 armhf [installed]
Mencari
ssh-agent -s
menggunakan secaragrep
masuk/etc
dan/lib
tidak menghasilkan apa-apa.Saya tidak memiliki lingkungan desktop yang diinstal, tetapi saya memiliki
/etc/X11
folder dengan beberapa file konfigurasi di dalamnya. Saya mencoba mengubah nama folder menjadi sesuatu yang lain dan mem-boot ulang untuk berjaga-jaga, tetapi prosesnya masih muncul, jadi sepertinya itu tidak ada hubungannya dengan ini.
Kesimpulan
Sekarang, untuk membuatnya sesederhana mungkin, saya hanya punya dua pertanyaan:
- Di mana dan bagaimana hal ini terjadi
ssh-agent
, siapa yang mengeluarkan perintah? - Mengapa tidak dipanggil dengan cara yang tepat, tanpa menetapkan variabel lingkungan yang diperlukan, dan karena itu meninggalkan proses untuk menggantung di sana tanpa batas?
~/.bashrc
saat itu.Jawaban:
Saya tahu beberapa kemungkinan alasan:
jika Anda menggunakan
libpam-ssh
, itu dapat secara otomatis memulai agen SSH untuk Anda sebagai bagian dari sesi awal, dan bahkan secara otomatis memuat kunci Anda jika mereka tidak memiliki kata sandi atau kata sandi mereka sama dengan kata sandi login Anda.jika Anda menggunakan
gpg-agent
, secara opsional dapat melakukan tugasssh-agent
juga. Shut-down ditangani secara berbeda, jadi hanya akan adaSSH_AUTH_SOCK
variabel lingkungan, bukanSSH_AGENT_PID
jika Anda memiliki SSH-agent (mis. Putty's Pageant) berjalan di workstation Anda dan membuat koneksi SSH dengan forwarding agen diaktifkan (dan remote
sshd
memungkinkannya), pada host jarak jauh Anda akan kembali melihat hanyaSSH_AUTH_SOCK
tanpaSSH_AGENT_PID
... karena soket agen pergi kesshd
mana terowongan itu kembali ke agen SSH workstation lokal Anda.sumber
libpam-ssh
; keduanyaSSH_AGENT_PID
danSSH_AUTH_SOCK
tidak disetel (soket tentu saja ada); Saya tidak menggunakangpg-agent
dan tidak memiliki penerusan agen diaktifkan pada Putty. Saya benar-benar bingung: \