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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Linux

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

Q&A

解決済

1回答

1943閲覧

ssh シェルスクリプト

coko1

総合スコア276

Linux

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

0グッド

0クリップ

投稿2016/10/27 06:17

お世話になります。
ssh接続を含むシェルスクリプト実行時、接続後にコマンドを複数扱うのですが。記述として、
ssh user@host "コマンド1 : コマンド2"のような記述でしかできないのでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ファイルにコマンドを記述してsshで読み込ませる事ができます
例は、ログインして2回cdしてファイル削除して、lsコマンドの実行 hogefileに記述

sh

1>cat hogefile 2cd hogedir 3cd testdir 4if [ -e Afile ]; then 5rm -f Afile 6fi 7ls -al 8 9 10>ssh user@host <hogefile

cat hogefile | ssh user@host
でも同じ

あまりお役に立てなかったので、1ラインで実行可能に挑戦してみました 01~99まで

sh

1for xx in $(find home/user/test -type d -name $(date +%Y%m%d)_*|sort); do xx=$(printf "%d" "${xx##*_}"); done; mkdir home/user/test/$(date +%Y%m%d)_$(printf "%02d" "$(( xx + 1))")

1ラインで実行可能 1~

sh

1for xx in $(find /home/user/test -type d -name $(date +%Y%m%d)_*); do xx=${xx##*_};if [ -z "$yy" ]; then yy=0; fi; if [ $yy -lt $xx ]; then yy=$xx; fi; done; mkdir home/user/test/$(date +%Y%m%d)_$((yy+1));

投稿2016/10/27 06:29

編集2016/10/31 09:13
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2016/10/28 02:15

Pseudo-terminal will not be allocated because stdin is not a terminal. と表示されます。なぜでしょうか
A.Ichi

2016/10/28 02:36

sshが踏み台経由の接続なので発生してい様です。 問題の記述となんら変わりは有りませんが、下記の方法ではどうでしょうか? ssh user@host "`cat hogefile`"
A.Ichi

2016/10/28 02:39

(ご参考)-t オプションで経由HOST指定で対応可能らしいですが、テストできてないです。
A.Ichi

2016/10/28 02:53

ssh -t user@hostA "ssh user@hostB ""`cat hogefile`""" は、出来ました。
coko1

2016/10/28 02:59

ssh user@host "`cat hogefile`" ですとリモート先でファイルを探すのでだめでしたね。
coko1

2016/10/28 03:12

ssh -t user@hostA "ssh user@hostB ""`cat hogefile`""" こちらについてなんですけど、AがどれでBがどれなのかがわからないのですが…
A.Ichi

2016/10/28 03:23

上記では`cat hogefile`を実行してから処理が行われのでできております。 もしかしたらsshにaliasが設定されていますでしょうか?設定が分かると対応方法有るかもしれません。 ssh user@host "ls" ができるので有れば、可能かと思っておりました。
A.Ichi

2016/10/28 03:25

ssh -t user@hostA "ssh user@hostB ""`cat hogefile`""" この場合はuser@hostAが踏み台で、実行はuser@hostBとなります。 /usr/bin/ssh -t user@hostA "ssh user@hostB ""`cat hogefile`"""
A.Ichi

2016/10/28 04:39

度々の修正ですみません下記の様にシングルクォート変えてください。 /usr/bin/ssh -t user@hostA "ssh user@hostB '`cat hogefile`' "
coko1

2016/10/28 04:45

いまいち理解できないのですが、ssh接続のみの場合 ssh user@hostでできるのですが、この時のhostはhostBであっているのでしょうか?
A.Ichi

2016/10/28 05:01

「Pseudo-terminal will not be allocated because stdin is not a terminal.」のエラーメッセージは、多段sshの時に出るものらしいので、コマンドはuser@hostでも、直接ではなく、どこかのサーバ経由で接続されていると考えておりました。その他かもしれませんね。 もし経由するサーバが分かれば上記の場合 hostAです。目的はhostB(user@host)と書けば良ったですね。 出来れば下記のコマンドで実行していただけないでしょうか?シングルクォートを入れています。  ssh user@host "'`cat hogefile`'" 同じ環境が出来なくて同じ結果になりませんでした。結果が出せずすみません。
coko1

2016/10/28 05:40

コマンドが見つかりませんと言われてしまいますね... 無知な質問で申し訳ないのですが、`` ← の記号が何を意味しているのかが分からないのですが教えていただいてもよいでしょうか?お恥ずかしながら、どのように入力するのかもわからないです
A.Ichi

2016/10/28 06:53

``このバッククォートはコマンドを実行します。例として echo `ls -l` echo ssh user@host "`cat hogefile`" と試しに打ってみてください。 hogefileが展開されて表示されればOKです。 同じ環境になる様に多段sshの設定を、自サーバに設定してテストをしました。 ssh -t user@hostA <hogefile だとエラーになりますが、 下記のコマンドの双方ともに結果はOKでした。 (.ssh/configに設定しました) ssh user@host "`cat hogefile`” ssh user@host "$(cat hogefile)”   $()は``の別の表現です 多段sshと想定してご要望の ssh -t user@hostA "コマンド1; コマンド2;" をhogefileに格納してsshコマンドの実行前に "" の中を展開して、コマンド入力と同じにして実行をさせようとしています。bashは改行と ; (セミコロン)は同じ意味なのでhogeファイルにはいれませんでした。 前回のssh user@host "'`cat hogefile`'"は、当方でもだめでした。テスト有難うございます。同じエラーが出るようなsshの設定を現在探しています。
A.Ichi

2016/10/28 07:12

何をhogefileにお書きになられたのか教えて頂けますでしょうか?
coko1

2016/10/28 07:34

ls -la pwd 等ですかね
A.Ichi

2016/10/28 07:50

ファイル内容に問題は無い様です、ファイルはLinuxファイルでしょうか? file hogefile と打って  hogefile: ASCII text  とでればOKです。 CRLFだとだめです。
coko1

2016/10/28 07:54

test.txt: ASCII text, with CRLF line terminators と表示されました。拡張子は.txtです。
A.Ichi

2016/10/28 08:02

ある意味良かった、CRLFでしたかそれであればWindowsファイルなのでエラーとなります。 nkf -Lu --overwrite hogefile をしてから再実行してみて下さい。 ssh user@host "`cat hogefile`” 秀丸等のエディタであれば保存の再にLFを選択する事もできます。
coko1

2016/10/28 08:09

いうのが遅かったかもしれませんが、windowsでOpenSSH(git bash)を使ってやっているのでwindows→linuxへのssh接続をやろうとしている状態です。
A.Ichi

2016/10/28 08:40

なるほど、リモートサーバにファイルから直接コマンドを送るのてCRLFがそのままリモートサーバに送られた事によるエラーだと思われます。 本意ではないでしょうがtest.txtの保存時にLFファイルに変更保存する事で実行されると思われます。termでの入力ではその辺はちゃんとLFに変更しています。 ssh user@host "`nkf -Lu hogefile`” で行けるかもしれません。windowsでOpenSSH(git bash)は使った事が無く言っておりますのでこのコマンドが可能かは分かりませんでした。 windowsでOpenSSH(git bash)の知識が無く失礼いたしました。
coko1

2016/10/28 09:29

うまくいかないですね... 最悪ファイルからコマンドを読み取らなくても "commnd1 ; ”変数使用処理” ; commnd3" みたいに処理を含めれば問題はないのですが、、、
A.Ichi

2016/10/28 10:33

windows git bashを入れてみました。合ってます?nkfは無い様でしたので、秀丸にてUTF8でLFで保存して、ssh user@host "`cat test.txt`” の実行までは出来ました。ファイルはgit管理すればcheckout時に自動変換する事ができる様です。その他の方法は検索中です。
A.Ichi

2016/10/28 10:51

windows git bashにはnkfは有りませんでしたがsedが有りましたのでCRLFも実行できました。 ssh user@host "`sed 's/\r//' test.txt`" まずはご報告まで
A.Ichi

2016/10/28 11:56

コマンド1ライン for xx in $(ls -d /home/user/test/$(date +%Y%m%d)_* 2>/dev/null); do xx=${xx#*_}; done; mkdir /home/user/test/$(date +%Y%m%d)_$(( xx + 1))
A.Ichi

2016/10/28 12:08

ディレクトリのみでした for xx in $(find /home/user/test -type d -name $(date +%Y%m%d)_*|sort); do xx=${xx#*_}; done; mkdir /home/user/test/$(date +%Y%m%d)_$(( xx + 1))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問