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

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

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

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

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Linux

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

1回答

460閲覧

web入力フォームから受け取ったデータをlinuxコマンドに引数として渡して処理したい(GO言語で)

mmmisaki

総合スコア34

bash

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

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Linux

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

1クリップ

投稿2019/04/10 15:42

webフォームから受けとったデータを外部のbashに渡し、その受け取ったデータでlinuxユーザのパスワードを変更するという
ものを実現したいのですが、expectを使用する以外に何か手法はございますでしょうか?
(linuxユーザに限らずldapのパスワードやsambaのパスワードなど、パスワード入力が求められるコマンド全般を処理できるようにしたい)


passwd <ユーザ>
を実行する際に発生する入力にwebFormからの入力データpasswd1 = 123(新しいパスワード) passwd2=123(確認用パスワード)使ってパスワード変更

expectを利用するとなぜか動作が不定になります
例えばpasswd1とpasswd2が同一なのにパスワードが変更されていない(passwords do not matchとはでない)
また逆にpasswd1とpasswd2の入力が同一でないのにpasswords do not matchと表示がでない
など

よろしくお願いいたします。

以下作ったコードです

Go

1package main 2 3import ( 4 "fmt" 5 "net/http" 6 "os/exec" 7) 8 9func main() { 10 http.HandleFunc("/", handler) 11 http.ListenAndServe(":8080", nil) 12} 13 14func handler(w http.ResponseWriter, r *http.Request) { 15 fmt.Fprint(w, guestbookform) 16 pass1 := r.FormValue("passwd1") 17 pass2 := r.FormValue("passwd2") 18 if len(pass1) != 0 && len(pass2) != 0 { 19 inputunixcommand(pass1, pass2) 20 } 21} 22 23func inputunixcommand(pass1 string, pass2 string) { 24 out, _ := exec.Command("./gopasswd", pass1, pass2).Output() 25 fmt.Printf("%s", out) 26} 27 28const guestbookform = ` 29<html> 30<body> 31change linux account 32<form action="/change" method="post"> 33<label> User name: <input type="text" name="passwd1"> </label> 34<label> Password: <input type="text" name="passwd2"> </label> 35<input type="submit" name="post"> 36</form> 37</body> 38</html>

bash

1#!/bin/bash 2expect -c " 3spawn passwd testuser2 4expect \"Enter new UNIX password\" 5send \"$1\n\" 6expect \"Retype new UNIX password:\" 7send \"$2\n\" 8interact 9"

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

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

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

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

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

guest

回答1

0

out, _ := exec.Command("./gopasswd", pass1, pass2).Output()

ここでerrの内容を確認していないのはよくないです。
こういった省略はサンプルコードにありがちですが、実際のところちゃんとチェックした方が良いです。

あと、.Output()よりも.CombinedOutput()の方がシェルスクリプト側でエラーが出た時も表示が見れるのでお勧めです。

投稿2019/04/11 11:36

nobonobo

総合スコア3367

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問