質問するログイン新規登録

Q&A

4回答

10358閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

3クリップ

投稿2018/12/17 04:05

編集2018/12/26 03:43

0

3

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

気になる質問をクリップする

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

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

guest

この質問の投稿者はすでに退会しているため、質問者からの返信がない点にご留意ください。

回答4

0

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

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

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

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

投稿2018/12/20 03:48

ssasaki

総合スコア1167

退会済みユーザー

退会済みユーザー

2018/12/20 04:03

やはりそうですか… >remote にログイン可能な鍵を local にも置いて というのは運用上NGなので… relay サーバーも共用環境なので ssh 後の個人ユーザでできることならやっていいと思いますが、アカウントを作るとかは問題があったとき責任問題になるので怖いです… 結局リモートから /tmp に scp して chmod で read つけて ローカルから scp して /tmp から消すという一連の作業をするしかないということでしょうか…
ssasaki

2018/12/20 04:12

例えば、remote_user@relay:/tmp -> remote:/tmp のコピーを cron で自動化するのはNGでしょうか? /tmp がダメなら remote_user の HOME ディレクトリの適当な場所でもいいと思いますが。 cron で自動化OKなら、local からは relay:/tmp にコピーすれば良いだけになります。 最大で1分ほどタイムラグは発生しますが。
ssasaki

2018/12/20 04:15

ちなみに、アカウントを作るという話はremote上ですよ。 remote上でコピーだけ可能なアカウントを作成しておき、その鍵をlocalに持たせるという話です。
退会済みユーザー

退会済みユーザー

2018/12/20 04:19

remote はサービス運用中のサーバーなのでもっとダメです 運用に必要な機能以外は一切つけることは許されないです どのみちルート権限をもってないので cron を変更するとかも管理者に相談しないといけなくてそこまでするなら現状でいいかなと思っています 手動でコマンドを何回かうてばできることなのでシェルの機能だけでどうにかできないかなと思ったんですが予想以上に難しいことなのですね…
ssasaki

2018/12/20 04:25

なるほど。なかなか制限が多いみたいですね。 ちなみに、cronはroot権限不要ですよ。 手動でコマンドを何回かうてばできる、という意味ではそういうshellスクリプトを組めばいいという話はありますよ。
退会済みユーザー

退会済みユーザー

2018/12/20 04:42 編集

>cronはroot権限不要 そうなのですか cron や rsync は使ったことがないのでまだよくわかってないですが remote_user@relay:/tmp -> remote:/tmp ができるとどこが短縮できるのでしょうか 現状のファイルコピー手順が ssh relay sudo remote_user scp remote:remote.txt /tmp chmod go+r /tmp/remote.txt 別ターミナルで scp relay:/tmp/remote.txt ./ 元のターミナル(relay上で) rm /tmp/remote.txt としてるんですが remote:/tmp を経由すると scp remote:remote.txt /tmp のかわりに ssh remote; cp remote.txt /tmp/ とかえって手間が増える気がするんですがそういうわけではないんでしょうか
ssasaki

2018/12/20 04: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 04:53

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

2018/12/20 04:59

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

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/19 05:05

neunetneucom

総合スコア122

退会済みユーザー

退会済みユーザー

2018/12/20 03:31

リモートにつながりはしたのですがやはりリモートユーザのパスワードを要求されてしまいます セキュリティの関係でリモートの接続情報は踏み台にしかおかれていないです…
退会済みユーザー

退会済みユーザー

2018/12/20 04:22

relay 内でユーザを切り替えないと remote にはつなげない relay 内ローカルユーザでは relay 内 remote ユーザが持ってる認証ファイルを読む権限がないと思います ためしにこんな感じでいつもうってるコマンドをつないでみたんですがやはり応答がなくてダメみたいでした ssh relay "sudo su - remote-user; ssh remote 'cat /var/log/messages'" > local.txt
neunetneucom

2018/12/21 06:15 編集

suしてからセミコロンで切っちゃうとあんまり意味ないのでこうですかね↓? ```bash ssh relay "sudo -u remote-user ssh remote cat /var/log/messages" > local.txt``` あとはrelay内でsudoするときにパスワード聞かれないよう、適切にsudoersを設定してあれば多分行けるかなと。
退会済みユーザー

退会済みユーザー

2018/12/21 10: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 10:43

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

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/18 13:13

TaichiYanagiya

総合スコア12240

退会済みユーザー

退会済みユーザー

2018/12/20 03:02

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

2018/12/20 09:18

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

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 05:39

fusechi

総合スコア128

退会済みユーザー

退会済みユーザー

2018/12/17 10:20

うーん… 応答しなかったです 直接リモートに ssh すると Permission denied (publickey,password). といわれるんですがそれすらもでないです ちなみに MySQL で relay:13306 を経由してトンネルすることはできていて 試しに 10022 を 13306 にかえてみたんですがやはり動かないです…
fusechi

2018/12/18 02: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 03:06

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

この質問の投稿者はすでに退会しているため、質問者からの返信やベストアンサーの選定がない点にご留意ください。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問