質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

踏み台経由でユーザを切り替えてリモートファイルを SCP する方法

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 3,639
退会済みユーザー

退会済みユーザー

local から踏み台(ホスト名 relay とする)にはユーザ名 local_user で
relay から remote にはユーザ名 remote_user でそれぞれ ssh ができて
relay 内で sudo su - remote_user で local_user から remote_user にユーザを切り替える権限をもっています 

relay 内で remote_user で scp して /home/remote_user にファイルをもってくることはできたのですが
/home/local_user  /home/remote_user はお互いにパーミション権限がなくファイル移動できず
ローカルからローカルユーザ権限で remote_user 権限のファイルを scp することができません

ファイルパーミションをあけて /tmp とか誰でも書き込める場所に移動して scp することはできますが
毎回やるのがかなり手間なので簡単にリモートファイルをコピーする方法はないでしょうか

たとえば踏み台の remote_user で
ssh -vNL 10022:localhost:22 remote
というポートフォワーディングをはっておいて
ローカルから
scp -P 10022 relay:/リモートファイルのパス
とうっても動きません…

追記:

ローカルで 
ssh -vNL 10022:localhost:10022 relay
というトンネルをさらに作って

local:10022 => relay:10022 => remote:22 という2段階のフォワードをつくってからローカル 10022 に

scp -P 10022 remote_user@localhost:/リモートファイルのパス

とうつと
ssh_exchange_identification: Connection closed by remote host
となってトンネル自体はできてるみたいですが認証がうまくいきません

追記

local で ssh relay だけで relay にログインできます
( パスフレーズを設定してるんですが UseKeychain yes をいれてします )

relay では sudo su - abc_user というコマンドで別ユーザになって
ssh remote とうてばパスフレーズなしでログインして remote の xyz というユーザになります

追記:
現状のファイルコピー手順
どうにかこれを簡略化したいです

ssh relay
sudo su - remote_user
scp remote:remote.txt /tmp
chmod go+r /tmp/remote.txt

別ターミナルを開いて(localで)
scp relay:/tmp/remote.txt ./

元のターミナル(relay上で)
rm /tmp/remote.txt
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

各ノードの役割を少し誤って認識されているようです。
今回のケースにおける各ノードの役割は以下です。

・localノードは relayノードの10022ポートに remote_user でssh接続する。
・relayノードは 10022ポートで受けた通信を remoteノードの22ポート へ転送する
・remoteノードは 22ポートでsshを受け付ける

この時 relayノードは通信を単純にリダイレクトできればよいので実行ユーザは問いません。
relayノードに local_user や remote_user ユーザを作成する必要もありません。

ですので、relay で実行されている以下コマンドは正しいですが、remote_user で実行する必要はありません。

ssh -vNL 10022:localhost:22 remote

ただし、OSの設定によっては上記コマンドは 127.0.0.1:10022 でリスニングしようとしますので、IPかホスト名も指定したほうが良いでしょう。

ssh -vNL relay:10022:localhost:22 remote

次にlocalで実行されてるコマンドには「remote_user で」ssh接続するという情報が必要ですので以下では足りません。

scp -P 10022 relay:/リモートファイルのパス

ユーザ名を指定して下さい。

scp -P 10022 remote_user@relay:/リモートファイルのパス

これで実現しようとしている通信が通るかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/17 19:20

    うーん… 応答しなかったです

    直接リモートに ssh すると
    Permission denied (publickey,password).
    といわれるんですがそれすらもでないです

    ちなみに MySQL で relay:13306 を経由してトンネルすることはできていて
    試しに 10022 を 13306 にかえてみたんですがやはり動かないです…

    キャンセル

  • 2018/12/18 11:23

    応答しないというのはどういう状態でしょう?
    scp コマンドを実行するとパスワードを入力する前に relayノードの標準出力に以下のようなメッセージが出ると思いますがそれすらも出ないということですか?

    debug1: Connection to port 10022 forwarding to 192.168.0.2 port 22 requested.
    debug1: channel 1: new [direct-tcpip]

    そうであれば、sshとポートフォワードの問題ではなく、OSのFirewallやネットワーク設定に問題がある可能性が高いです。全ノードのFirewallを一旦OFFにして試してみて下さい。

    キャンセル

  • 2018/12/20 12:06

    応答しないというのはメッセージもなく Connection refused もなく待ち続けてる状態です
    relay 10022 自体はあいてるはずです
    いつも MySQL をトンネル経由で 13306 使ってるんですが 13306 を指定しても応答がありません

    キャンセル

0

ホスト local も Linux ですよね?
であれば、Local Forward で local:10022 を remote:22 に結びつけるといいと思います。

ssh -f -N -L 10022:remote:22 local_user@relay


ssh/scp で localhost:10022 ポートに接続すると、remote の sshd につながりますので、remote_user でログイン/ファイルコピーできると思います。

scp -P 10022 <file> remote_user@localhost:

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/20 12:02

    ありがとうございます
    リモートに scp はつながるんですがパスワードを要求されてしまいます
    セキュリティの関係上リモートの認証情報は踏み台にしかないので…

    キャンセル

  • 2018/12/20 18:18

    remote へログインするパスワードまたは秘密鍵が local にないとダメですね。
    relay に sshfs (fuse-sshfs) をインストールし、一度、relay 上で remote のディレクトリをマウントして relay 上のディレクトリに見せかけて、local から relay に scp するとかでしょうか。

    キャンセル

0

ちょっと質問と関係がうすいので恐縮ですが、ユーザー名の指定とかがすっきりするので書いておきます。

SSHのオプションでProxyCommandというのがあります。これを使うと一撃でユーザー指定しつつトンネル掘って、任意のホストまでSSH(SCP)できます。

.ssh/configに下記の通り入れてみてください。(内容をフィーリングで感じ取って、適宜調整してください。)

Host Relay # 任意の名前
    User        local_user
    Hostname    relay # IPとかホスト名とか

Host Remote # 任意の名前
    User        remote_user
    Hostname    remote # ここにはrelayから繋ぐ時のIPなりホスト名、たとえばプライベートIPなど
    ProxyCommand    ssh -W %h:%p Relay # sshが古い環境だと要差し替え。最後のRemoteがHostで登録した名前であることに注意
    # IdentityFile    ~/.ssh/id_rsa

この状態で、scp localfile Remote:remotefileとかすると少し幸せになれます。
さらに、SSH鍵を指定したい場合はIdentityFile とかを追加すればOKです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 15:15 編集

    suしてからセミコロンで切っちゃうとあんまり意味ないのでこうですかね↓?

    ```bash
    ssh relay "sudo -u remote-user ssh remote cat /var/log/messages" > local.txt```

    あとはrelay内でsudoするときにパスワード聞かれないよう、適切にsudoersを設定してあれば多分行けるかなと。

    キャンセル

  • 2018/12/21 19:41

    何度もすみません
    relay 内では
    sudo su - remote_user
    というコマンドでユーザを切り替えてたみたいです
    手順書をコピーして実行していたのではっきりおぼえていませんでした
    後出し情報ですみません

    ssh relay "sudo su - remote-user ssh remote cat /var/log/messages" > local.txt

    とうったところ
    /usr/bin/ssh: /usr/bin/ssh: cannot execute binary file
    となってしまいます

    キャンセル

  • 2018/12/21 19:43

    ssh relay "sudo -u remote-user ssh remote cat /var/log/messages" > local.txt
    こううったところ Host key verification failed. になってしまいます

    キャンセル

0

remote:22 にポートフォワードしている限りは、普通に remote の sshd とやりとりすることになるので当然認証が走りますよね。
remote の sshd の設定が公開鍵認証のみになっているのであれば、通常通り鍵やパスフレーズが必要です。
ポートフォワードのみだと単に多段 ssh の簡略化以上の効力は無いと思います。

ファイルコピーを楽にする方法はいくつかあると思いますが、ポリシーにもよるのでズバリな回答は難しい気がしますね。
とりあえず簡単に思いつくのは下記くらいですが。。

・remote にログイン可能な鍵を local にも置いて、ProxyCommand もしくはポートフォワードで多段 ssh を簡略化する(コピー用のアカウントと鍵を用意すればセキュリティ的にもそれほど問題にならないと思います)

・relay 上の特定の領域をファイル同期用の領域として、cron で ssh+rsync などで自動的に remote 上に同期する仕掛けを設定しておく。local からはその relay 上の同期用の領域に scp する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/20 13:50

    remote_user@relay:/tmp -> remote:/tmp が cron で自動化できていれば、、
    local 上で例えば
    scp /tmp/remote.txt relay:/tmp/remote.txt
    でおしまいです。
    relay:/tmp/remote.txt は自動的に remote:/tmp/remote.txt に同期されます。
    コピー後のファイルを削除しないといけないとかそういった取り決めがあるとまた話は変わってきますね。

    キャンセル

  • 2018/12/20 13:53

    あ すみません アップロードの話だったのですね
    リモートからローカルにファイルをもってくる話のつもりでした

    キャンセル

  • 2018/12/20 13:59

    すみません。ダウンロードの方ですね。
    であれば、cron の同期を逆向きにすればOKです。
    ただ、download/upload 双方となると、この方法でも可能ですがかなりイマイチなので別の方法を考えた方が良いですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る