ssh
。それは素晴らしいツールですが、私はいつもそれについて奇妙なことを1つ見つけました。 ssh接続ではとを使用scp
してファイルを転送できますsftp
が、ローカルホストでプログラムを実行したり、リモートからローカルマシンに接続したりせずに、ローカルシステムとリモートシステム間でファイルを移動することはできません。
サーバーはファイアウォールの背後またはNATルーターの背後にある間、つまり永続的なIPアドレスなしで接続されることが多いため、後者は実際の問題です。その結果、サーバーは、いずれの場合も、以前にアクセスされたローカルシステムに接続できなくなります。 sshセッションで、ローカルファイルまたはリモートファイルを取得して目的の場所に転送できる場合は、非常に便利です。
実際、私はこの目標を完全には達成できませんでしたが、達成に非常に近づきました。この記事では、ローカルコンピューターにリモートディレクトリをマウントできるスクリプトについて説明します。ローカルマシンに、インストールする必要があります
sshfs
、ただし、プログラムをインストールできない可能性のある遠隔地では、何も変更する必要はありません。システムのセットアップに時間を費やし、クライアントコンピューターに動作中のsshサーバーがある場合は、リモートシステムにローカルディレクトリをマウントすることもできます。IPアドレスやポートのブロックについて心配する必要はありません。実際、リモートマシンに接続できれば、私が話したいことに成功することを意味します。
結果として、これらすべてを組み合わせると、私は目標に非常に近いことがわかります。クライアントまたはサーバーでコマンドシェルを操作でき、接続の両側でファイルの読み取りと書き込みを簡単に行うことができます。これを行うには、すべてを正しく構成する必要があります。
ここに落とし穴はありますか?
おそらく、あなたはある種のキャッチがあると判断します。結局のところ、実際には、2つのssh接続の使用について話しているのです。1つはファイルシステムのマウントに使用され、もう1つはコンピューターへのログインに使用されます。そして、これは実際のところです。ただし、正しく構成されていれば
ssh
、2つの接続の編成に多くの時間を費やすことなく、認証を1回だけ実行する必要があります。
さらに、作業は、後で説明するスクリプトによって大幅に容易になります。詳細がユーザーに表示されないため、接続手順は(ほぼ)通常どおりに見え、その後はすべて正常に機能します。
sshfsについて一言
このユーティリティを
sshfs
使用すると、ユーザースペースのファイルシステム(ユーザースペースのファイルシステム、FUSE)を操作できます。つまり、ベースファイルシステムの上にあるユーザースペースにレイヤーがあるという事実について話しているのです。この場合、そのようなファイルシステムはをサポートするsshサーバーですsftp
。これにより、リモートシステムにあるファイルを操作して、ローカルコンピューター上の実際のファイルシステムにあるかのように扱うことができます。まだ試していない場合はsshfs
、試してみてください。このユーティリティは非常にうまく機能します。
コンピューターにログオンし
myserver
、ローカルマシンから次のコマンドを実行するとします。
sshfs myserver:/home/admin ~/mounts/myserver
これにより
/home/admin
、パスに沿ってローカルシステム上のリモートコンピュータのディレクトリにアクセスできるようになります~/mounts/myserver
。
を使用する場合、
sshfs
さまざまなオプションを使用できます。たとえば、接続が失われた後に再接続するように手配できます。詳細については、sshfs
ヘルプを参照してください。リモートでマウントされたバージョンのファイルを使用する
ため
sshfs
、ファイルに加えられたすべての変更はリモートマシンに保存されます。そして、sshfs接続が閉じられた後、ローカルコンピュータには何も残りません。これを今すぐ修正します。
準備
上記のスクリプトの説明に移る前に、必要に応じて自分で変更できるクライアント設定のいくつかについて説明したいと思います。そこで、ここでディレクトリを作成し
~/remote
、その中に各リモートコンピュータのサブディレクトリを作成します。たとえば、ディレクトリ~/remote/fileserver
と~/remote/lab
。
スクリプトはと呼ばれ
sshmount
ます。と同じ引数を取りますssh
。スクリプトでの作業を簡素化するには、リモートホストに関する情報をファイル~/.ssh/config
に保存する必要があります。これにより、単純で短いホスト名を使用できるようになります。たとえば、コンピュータ情報lab
は次のようになります。
Host lab
Hostname lab.wd5gnr-dyn.net
Port 444
User alw
ForwardX11 yes
ForwardX11Trusted yes
TCPKeepAlive yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
これは実際には必要ありませんが、このアプローチを使用
~/remote/lab
すると、複雑なビュー構造ではなく、見栄えの良いディレクトリを自由に使用できます~/remote/alw@lab.wd5gnr-dyn.net:444
。これらすべてのパラメータについて不思議なことは何もありません。私はそれにあなたの注意を引きたいだけだControlMaster
とControlPath
あなたがより速く、この場合には、非常に重要である、化合物で実行するように整理することができます。
さらに、秘密のsshキーを使用して、リモートシステムへの自動接続を整理できます。ここだそれについてのものが。
脚本
スクリプトは2つの方法で使用できます。したがって、へのリンクを介して呼び出された場合
sshunmount
、指定されたリモートホストに関連付けられているファイルシステムがアンマウントされます。別の方法で呼び出された場合(通常はどのようにsshmount
)、次の3つのアクションを実行します。
~/remote
ディレクトリにホスト名と同じ名前のサブディレクトリが含まれているかどうかを確認します(たとえば、-lab
)。そのようなディレクトリがない場合は、エラーメッセージが表示され、作業が続行されます。- そのようなディレクトリが存在する場合、必要なファイルシステムがすでにマウントされている場合、スクリプトはマウントされたファイルシステムのリストを調べます。もしそうなら、彼は働き続けます。
- ディレクトリがマウントされていない場合は、呼び出し
sshfs
て続行します。
このスクリプトはGitHubにあります。そして、ここにそのコードがあり、そこからいくつかのコメントが削除されています:
#!/bin/bash
if [ "$1" == "" ]
then
echo Usage: sshmount host [ssh_options] - Mount remote home folder on ~/remote/host and log in
echo or: sshunmount host - Remove mount from ~/remote/host
exit 1
fi
# sshunmount...
if [ $(basename "$0") == sshunmount ]
then
echo Unmounting... 1>&2
fusermount -u "$HOME/remote/$1"
exit $?
fi
# ...
if [ -d "$HOME/remote/$1" ] # ?
then
if mount | grep "$HOME/remote/$1 " # ?
then
echo Already mounted 1>&2
else
sshfs -o reconnect $1: $HOME/remote/$1 # mount
fi
else
echo No remote directory ~/remote/$1 exists 1>&2
fi
ssh $@ #
このスクリプトは、必要なものの半分を提供してくれます。つまり、接続しているローカルコンピューター上のリモートファイルを簡単に操作できます。しかし、リモートコンピュータからローカルマシンにあるファイルを操作できるようにすることは、もう少し難しいです。
逆の問題を解く
ローカルマシンのサーバーにフォルダーをマウントして実験する場合は、ローカルマシンでsshサーバーを実行する必要があります。もちろん、ローカルコンピュータが表示され、サーバーからアクセスできる場合は、簡単です。リモートコンピュータで実行
sshfs
し、ローカルコンピュータからフォルダをマウントするだけです。ただし、多くの場合、ファイアウォールやルーターの背後にあるローカルシステムにアクセスできません。これは、ローカルシステムの役割が、さまざまな場所からネットワークに接続できるラップトップによって果たされている場合に特に当てはまります。
しかし、これらすべての困難にもかかわらず、私たちの仕事はまだ解決することができます。その解決策には2つの部分があります。
まず、電話するときに必要です
sshmount
、追加の引数を指定します(同様のコマンドを常に実行する必要がある場合は、ファイルを編集できます)。
sshmount MyServer -R 5555:localhost:22
次に、ホストに接続した後、次のコマンドを実行する必要があります。
sshfs -p 5555 localhost:/home/me ~/local
オプションのおかげ
-R
で、ポート上のソケットがリモートマシン上に作成され5555
(もちろん、これは空いているはずです)、22
ローカルマシンのポートとの接続が実行されます。 sshサーバーがポート22
で実行されているとすると、サーバーは同じ接続を介してローカルマシンに接続できます。 IPアドレスを知っている必要も、開いているポートを持っている必要もありません。
このコマンドは
sshfs
、システムの起動時に実行でき、ローカルディレクトリ/home/me
を~/local
リモートサーバー上のディレクトリにリンクします。さらに、ローカルでログインしている場合は、で始まる環境変数を確認しSSH_
、SSH接続について詳しく知ることができます。たとえば、これらは変数$SSH_CLIENT
と$SSH_TTY
です。
もちろん、上記のコマンドを機能させるには、ホスト名とディレクトリ、およびポートアドレスをシステムで使用されているものに変更する必要があります。ただし、すべてを構成すると、必要なすべてのファイルがローカルマシンとリモートマシンの両方で使用できるようになります。ちなみに、私はディレクトリの循環マウントを整理しようとはしませんでした。これを行おうとすると、非常に奇妙なことが判明する可能性があります。
結果
ローカルマシンのリモートフォルダとリモートマシンのローカルフォルダを同時にマウントする場合は注意が必要だと思います。たとえば、ファイルシステム全体をスキャンするユーティリティは、このような構成では混乱する可能性があります。さらに、最後のセッションを終了するときにサーバーファイルシステムから適切に切断する方法についての質問に対する答えをまだ探しています。
しかし今でも、これらすべてが、ソフトウェアファイルを使用して便利で信頼性の高い作業を整理するための優れたツールを提供します
ssh
。リモートシステム上のファイルの操作の問題を解決するための別のオプションは、フォルダーを同期し、それらを使用してコンピューター間でファイルを転送することであることに注意してください。
リモートLinuxシステムでファイルを操作するために何を使用しますか?