92276
WindowsからLinuxサーバーへssh接続した後に、コマンド実行するバッチを作成したいです。

通常、sshコマンドで接続して-cオプションで、コマンドを実行する認識です。

今回は、Linuxでシェルを実行するのですが、シェル内に「read -p」で手入力の値を使用します。

-cオプションで、コマンドを実行した場合、1行でssh接続が完結してしまい、応答入力が出来ないです。  
ssh接続後に、応答入力する方法はありますか？

また、応答入力した値を元にファイル取得するバッチにしたいです。

何か方法があれば教えてほしいです。

〈シェルスクリプト例〉

read -p "取得年月を入力 (例：2022 11)" DATA1 DATA2

**省略**  
SQL文で、CSV出力してファイル名にDATA1 DATA2を使用。
CC BY-SA 4.0
2022-11-01T07:15:52.380
91925
2022-11-17T06:51:50.410
55132
question
linux windows ssh batch-file shell
Windowsのバッチで、ssh接続した後にコマンドを入力したい。
Windows側は標準のopensshを使うとして、Linux側は$HOMEに以下のhoge.shがあるとします。中身は以下のようにbashのread内部コマンドを使用しています。

```

    #!/bin/bash
    read -p "input: " HOGE
    echo "${HOGE}" | bc
    
```

Linuxにログインしてる場合は、このスクリプトが以下のように実行できるとします。

```

    $ cd $HOME
    $ ./hoge.sh
    input: 
    
```

さらに端末から1+2[Enter]と入力すると以下のように計算結果が出力されるとします。

```

    $ ./hoge.sh
    input: 1+2
    3
    $
    
```

また、Windowsからは以下のコマンドでパスワード入力なしにログインできる(パスフレーズなしの公開鍵認証)とします。

```

    C:\Users\user>ssh ホスト名
    Last login: Sat Nov  5 09:07:15 2022 from 10.0.2.2
    user@user-pc:~$ exit
    ログアウト
    Connection to ホスト名 closed.
    
    C:\Users\user>
    
```

ここで、bashのread内部コマンド用に入力用テキストファイルhoge.txtをWindows側に用意します。中身は以下のとおりです。

```

    1+2
    
```

これで実行条件が整いました。

Linuxでバッチ実行させるには以下のようにしてください。

```

    C:\Users\user>type hoge.txt | ssh ホスト名 "bash hoge.sh"
    3
    
    C:\Users\user>
    
```

"bash hoge.sh"は"./hoge.sh"でも構いません。
CC BY-SA 4.0
2022-11-05T00:21:08.173
92003
2022-11-05T00:21:08.173
54957
91925
answer
> 今回は、Linuxでシェルを実行するのですが、シェル内に「read -p」で手入力の値を使用します。  
>  -cオプションで、コマンドを実行した場合、1行でssh接続が完結してしまい、応答入力が出来ないです。

以下のように`-t`オプションを付ければ`read -p 文字列`の文字列が表示されます。入力したデータも`read`が読み込みます。

```

    ssh -t -l Linuxユーザ Linuxホスト名 shスクリプトのパス
    
```

※バッチから実行するのであれば鍵を使うのがよいと思いますがここでは触れません。

> また、応答入力した値を元にファイル取得するバッチにしたいです。

応答した内容を呼び出し側で取得するのは、  
WindowsのcmdでもPowershellでも(Linuxのシェルでも)問題があります。  
がんばれば、sshの実行結果を変数に取り込むことはできるかもしれませんが、  
`read -p 文字列`で指定した文字列が画面に表示されなくなります。

> 何か方法があれば教えてほしいです。

Linuxのシェルスクリプトの振る舞いを変えるために、会話形式とするのではなく、引き数で指定するのがよいと思います。  
ターゲットとなるLinuxのシェルスクリプトを修正するのが簡単です。  
修正してはいけないのであれば、もう一つシェルスクリプトを作って、引数で指定された値をターゲットのスクリプトの標準入力に渡せばよいと思います。
CC BY-SA 4.0
2022-11-05T07:23:13.177
92012
2022-11-05T07:41:27.537
2022-11-05T07:41:27.537
35558
35558
91925
answer
質問投稿者です。

今回やりたかったことをざっくりと話すと、  
シェルスクリプトで、データベースからCSVファイルを抽出して、LinuxサーバーからWindowsサーバに転送することでした。

いろいろと制限があり、  
WindowsからLinuxサーバーへssh接続した後に、コマンド実行したいと考えていましたが、  
シェルスクリプト実行時に、会話形式で取得した値（変数）をファイル名で使用するなどの観点から、  
あまり現実的ではないのかなという結論に至り、そもそものやり方を変えることにしました。

Windowsのバッチで、  
Teratermマクロを使用してシェルスクリプトを実行させCSVを出力した後に、  
Windows側からLinux上にあるファイルを取りに行くようにしました。

回答・コメントいただいた方、ありがとうございました。
CC BY-SA 4.0
2022-11-17T06:51:50.410
92276
2022-11-17T06:51:50.410
55132
91925
answer