pasang direktori lokal ke server ssh jarak jauh

7

saya ingin me-mount direktori lokal ke server ssh jarak jauh. khususnya direktori ~ / .gnupg saya sehingga saya dapat menggunakan keyring lokal saya di mana saja, tanpa menyimpannya dari jarak jauh.

jadi saya pikir solusi ini:

  • biarkan server ssh lokal tetap dibuka (firewall sesuai keinginan Anda)
  • ssh ke penerusan jarak jauh lokal: 22 ke jarak jauh: 10000
  • luncurkan sshfs untuk me-mount localhost: 10000: .gnupg ke ~ / .gnupg

saya meletakkan ini di ssh / config saya:

Host remote
        HostName remotehost
        RemoteForward 10000 localhost:22
        User user
        PermitLocalCommand yes
        LocalCommand sshfs -p 10000 [email protected]:/Users/remoteuser/.gnupg .gnupg

melakukan ssh, saya mendapatkan:

fuse: bad mount point `.gnupg': No such file or directory

jika saya menjalankan sshfs secara manual setelah ssh login semuanya berfungsi dengan baik. jadi saya kira direktif LocalCommand dijalankan sebelum RemoteForward.
bagaimana mengatasi ini?

robert laing
sumber
Coba gunakan path lengkap untuk .gnupg ... ssh belum tentu memiliki direktori kerja yang sama dengan shell Anda.
barrycarter
@barrycarter: sekering hasil yang sama: bad mount point `/home/rob/.gnupg ': Tidak ada file atau direktori seperti itu
robert laing
Jadi, apakah jawaban saya membantu Anda?
crimson-egret

Jawaban:

5

Soal: ssh's LocalCommanddijalankan pada lokal (klien) side, tidak jauh seperti yang Anda inginkan. Tidak ada RemoteCommandpilihan, tetapi Anda dapat meretas fungsionalitas ke file konfigurasi Anda. Catatan, semua ini menganggap bahwa remotehost:.gnupgdirektori Anda ada sebelumnya.

Opsi 1: Gunakan dua spesifikasi host terpisah di ~/.ssh/config:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%n-mount -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

Host remote-mount
    HostName remotehost
    ForwardAgent yes
    RemoteForward 10000 localhost:22

Kelemahan: kedua entri harus keluar untuk setiap host yang Anda inginkan titik pemasangan ini.

Opsi 2: Gabungkan opsi ssh dan penerusan port ke LocalCommand:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

Perhatikan perbedaan halus dalam dua LocalCommandbaris adalah penggunaan% n pada contoh pertama dan% h pada baris kedua. Ini akan berhasil, tetapi memiliki satu ASUMSI besar : Anda TIDAK PERNAH ssh ke host dengan nama sebenarnya dan hanya melalui "nama pendek" yang ada di .ssh/configfile Anda , jika tidak, Anda akan berakhir dengan loop tak terbatas sshkoneksi yang mencoba mengeksekusi Anda LocalCommand.

Opsi 3: Gunakan SSH Multiplexing untuk mengatur hanya satu koneksi ke remote:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
    ControlMaster auto
    ControlPersist 30m
    ControlPath ~/.ssh/controlmasters/%r@%h:%p

Saya pikir itu satu-satunya solusi yang menang, dan bahkan dapat bekerja dalam Host *aturan, DAN tidak menderita kerugian. Bahkan memecahkan masalah bahwa sesi ssh kedua ke host yang sama TIDAK akan mencoba untuk me-remount direktori yang sama melalui sshfs.

Peringatan: Satu masalah terakhir yang tidak ingin saya atasi: remote Anda sshfsakan bertahan lama setelah Anda keluar dari host remote. Bahkan, itu tidak akan pernah terjadi unmount, kecuali jika localhost Anda offline atau koneksi terputus.

Anda bisa melihat beberapa pilihan lain untuk umountyang sshfsme-mount saat Anda log out dari remote host, mungkin menggunakan ide-ide seperti ini . Atau Anda bisa bermain game dengan LocalCommanduntuk mengeksekusi sesuatu yang menonton dan self-umount setelah melihat beberapa peristiwa pemicu terjadi, tetapi tampaknya rapuh.

Pilihan lain adalah membungkus sshperintah dalam beberapa shell atau mungkin digunakan ProxyCommanduntuk melakukan sesuatu yang rumit, tapi saya akan meninggalkan itu sebagai latihan untuk pembaca.

kuntul merah
sumber
Catatan: Sejak OpenSSH 7.6 sekarang ada opsi RemoteCommand: openssh.com/txt/release-7.6
image