ラベル ssh の投稿を表示しています。 すべての投稿を表示
ラベル ssh の投稿を表示しています。 すべての投稿を表示

リモートマシンのファイル群のtarアーカイブをリモートマシンに一時ファイルを作成しないでsshで取得する

ありがちな方法(一時ファイル作成)

リモートマシンのファイル群をtarアーカイブとして取得する場合、以下のようのリモートマシンで一度tarアーカイブを作成することは、よく見る状況である。
  1. リモートマシンにSSHでログイン
  2. リモートマシンで、tarコマンドを実行してtarアーカイブを作成する
  3. ローカルマシンからscpで、リモートマシンのtarアーカイブをコピー
  4. リモートマシンで、tarアーカイブを削除
この方法の欠点は、リモートマシンに一時的にtarアーカイブを保存する空き容量が必要なことである。 大量のファイルをローカルにコピーするときは、これがネックになる。

一時ファイルを作らない方法

リモートマシンremoteの/home/foo以下をすべてtarアーカイブfoo.tar.gzとしてバックアップする場合、 ローカルマシンで以下のように入力する。
ssh remote tar czf - /home/foo > foo.tar.gz
上記の青字の部分は、リモートマシンで実行されるコマンドである。リモートで実行したコマンドの標準出力は、ローカルのsshコマンドそのものの標準出力に出力される。上記でtarの出力ファイルとして-(標準出力)を指定しているので、結果としてローカルのsshの標準出力にtarアーカイブの内容が出力される。そこで> foo.tar.gzでローカルのファイルにリダイレクトすれば、そのままtarアーカイブとなる。これを図にすると次のイメージである。
なお、標準入出力については下記を参照。 また、tarをカレントディレクトリが/home/fooで実行させるには以下のようにする。
ssh remote "(cd /home/foo; tar czf - .)" > foo.tar.gz

多段SSHごしでのtarアーカイブ取得

local -> remote -> remote2のようにremoteを介してremote2へ多段SSHして、remote2のファイル群のtarアーカイブを直接取得することもできる。
ssh -J remote remote2 tar czf - /home/goo > goo.tar.gz

sshホスト鍵の作成例

ssh-keygen -N '' -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
  • -N ''でパスフレーズをなしに設定
  • -t ed25519でED25519の鍵を作成。他にもRSAやECDSAのホスト鍵を作ることが一般的だが、私の環境では、すべてのSSHクライアントがED25519に対応しているのでこれだけ作成
  • -fは、作成した鍵を保存するパスを指定するオプション

SSHサーバをrootでのパスワード認証を許可して一時的に起動する方法

最近の多くのLinuxディストリビューションの多くでは、デフォルトでrootでのパスワード認証が禁止されている。 以下のコマンドは、一時的にrootでパスワード認証でログインできるSSHサーバを独立して起動する。
/usr/bin/sshd -d -p 8022 -o "PermitRootLogin yes"
  • -d: フォアグランでデバッグメッセージを表示しながら実行
  • -p: ポート番号
  • -o: rootでのパスワード認証を許可するためのオプション

クライアントからログインする方法
ssh -p 8022 -lroot サーバのIPアドレス

sshでSOCKSプロキシを作成し、遠隔地経由でWebコンテツを取得する

概要

下図のように、My SiteからWeb Server Xには直接接続できないが、SSH接続可能な遠隔地のSSH Server(remote_server)経由なら接続できる場合に、My SiteのWebブラウザにWebServer Xのページを表示する方法を説明する。

ここでのremote_serverとして、AWSやAzureなども利用可能。その場合、HTTPリクエスト元の地域を接続するデータセンタの拠点にすることができる。

SOCKSプロキシの作成

My SiteのSSH clientで以下のように入力する。これは、My SiteにSOCKSプロキシを作成する。また、HTTPリクエストはremote_server経由で行われる。ポート番号8080は変更可能。
ssh -D 8080 remote_server

Webブラウザの設定

Webブラウザで、SOCKSプロキシを設定する。SSH Clientをlocalhost(同じマシン)で実行している場合、次のようにlocalhostを指定する。

Chrome

google-chrome --proxy-server="socks://localhost:8080"

Firefox

メニュー -> 設定 -> ネットワーク設定 -> 接続設定 でプロキシの設定画面が表示される。ここでSOCKSホスト欄にSSH clientのIPアドレスとポートを入力する。

SSHのコマンドラインでKeyExchangeアルゴリズムを追加する方法

古いサーバへのSSHで以下のように表示されることがある。
Unable to negotiate with 192.168.1.10 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
以下のようにすればよい
$ ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 192.168.1.10

GitHubに公開鍵を登録していないユーザーにsuして、ssh経由でpushやpull、cloneをする

ここでは、以下の条件でcloneする例を以下に示す。

githubに公開鍵を登録してるユーザー:foo
suするユーザー: root
$ sudo -E su
-Eをする理由はSSH_AUTH_SOCK環境変数を引き継いでssh-agentによる自動パスフレーズ入力をするため。これは必ずしも必須ではない。
あとは、次のような.ssh/configを作成すれば、gitでgithubからcloneするときにfooとして操作が行われる。
Host github.com
  user foo
  identityfile /home/foo/.ssh/id_rsa

SSHでパスフレーズ認証ができなくなった場合の対処法

ある日、急にSSHのパスフレーズ認証ができなくなっていた。 理由は、誤って自ユーザー(以下の例ではfoo)のホームディレクトリのパーミッションが777にしていたため。
$ ls /home 
20K drwxrwxrwx 57 foo  20K  6月 26 17:00 foo
これを755に修正したら、正常にもどった。なお、ネットを検索すると701にするべきという情報もあるので、ディストロや設定によってはそうしなければならないのかもしれない。

SSH agentをForwardする

~/.ssh/configに以下の記述を追加する
ForwardAgent yes
これで、ログインするとSSH agentがフォーワードされる。 loginすると次のような環境変数が設定されている。
SSH_AUTH_SOCK=/tmp/ssh-6qafmTrfjF/agent.3055

Ubuntu 15.10のsshdでarcfour128を許可する

Ubuntu 15.10のsshdが許可するCiphersは、man sshd_configによると以下のとおり。
The default is:

aes128-ctr,aes192-ctr,aes256-ctr,
aes128-gcm@openssh.com,aes256-gcm@openssh.com,
chacha20-poly1305@openssh.com
安全なLANやVPNを通じた接続では、強い暗号を使う必要性が低下するので、スループット向上とマシン負荷軽減のためにarcfour128を使いたい場合、以下の設定を行う。

1. /etc/ssh/sshd_confに以下の行を加える
Ciphers arcfour128,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
2. sshdを再起動
# service sshd restart

sshで強制的に端末を割り当てる

スクリプトでsshを使って、標準入力からコマンドを与えようとすると以下のエラーがでる場合がある。
Pseudo-terminal will not be allocated because stdin is not a terminal.
このような場合、ssh -t -t ...-tを2つ指定すると解決する。あるいは-ttとしてもよい。

なお、入力側が端末をもっている場合(端末で手動で入力するような状況)は、-tを1つ指定するだけでよい。

参考: teminal(端末)やstdin(標準入力)とは

下記に端末とそれに深く関連する標準入出力について解説しています。

gitで内部的に呼ばれるsshを別のユーザーとして実行する

この例では、ユーザーfooとしてsshを実行します。
1. ラッパースクリプトを作成。ここではssh-as-fooとしてます。
#!/bin/sh
ssh -lfoo -i/home/foo/.ssh/id_dsa "$@"
2. GIT_SSH環境変数に、上記のスクリプトを指定。
$ GIT_SSH=ssh-as-foo git pull

直接、通信できないホストからポートフォワーディングでsshログインする。

次のような環境を想定します。ホスト2からログインする方法を紹介します。

通信可能: host1 -> host2
通信付加: host1 x<- host2

1. ホスト1でhost2にポートフォワードします。
(host1)$ ssh host2 -R 8022:localhost:22
上記コマンドは、host2の8022番ポートを、host1(localhost)の22番ポートにフォーワードします。


2. ホスト2で、ポートを指定してログイン
(host2)$ ssh -p 8022 localhost

sshで直接リモートホストのscreenを使用する。


$ ssh host -t "screen -r"
ポイントは-tオプション。これが無いと端末が確保されないので、screenなど端末を使用するプログラムを起動できない。

rootで一般ユーザーのsshキーペアを使ってgit cloneする

例:青字の部分を適宜変更。
# SSH_AUTH_SOCK=/run/user/1000/keyring/ssh git clone ssh://user@host/hoge/foo foo

CentOS6のsshでパスフレーズ認証できない場合の対処方法(SELinuxの解除)

CentOS6で、パスワード認証ではログインできるけど、パスフレーズ認証できない(パスワード入力が表示される)ことがあった。パブリックキーを.ssh/authorized_keysとしてコピーし、パーミッションも600にしているにもかかわらずだ。 原因は、SELinuxが有効になっていたため。SELinuxの無効化方法は、/etc/selinux/configの中を以下のように変更し、再起動。
#SELINUX=enforcing
SELINUX=disabled
一時的な変更ならば、コマンドラインで以下のように入力する。
# setenforce 0

X11 forwarding request failed on channel 0と表示されてsshでX11 forwardingできない時の対処法

sshに-vオプションをつけて、詳細を表示させ、原因を探る。 以下のようにauth programがないと言われている場合、xauthをaptなりyumでインストールすればよい。
...
debug1: Remote: No xauth program; cannot forward with spoofing.
X11 forwarding request failed on channel 0