20190307のLinuxに関する記事は9件です。

AWSで簡易なSFTPサーバー構築 - SFTPサーバー設定

ec2-userでSSHログイン

rootユーザに変更

$ sudo su -

ユーザー作成

# useradd ユーザー名

rootユーザーからexit

# exit

作成したユーザーに変更

$ sudo su 作成したユーザー名

作成したユーザーのホームディレクトリに移動

$ cd /home/作成したユーザー名

.sshディレクトリ作成

$ mkdir .ssh

.sshディレクトリのパーミッション(権限)を700に変更

$ chmod 700 .ssh

.sshの直下にauthorized_keysファイル作成

$ touch .ssh/authorized_keys

authorized_keysファイルのパーミッションを600に変更

$ chmod 600 .ssh/authorized_keys

秘密鍵公開鍵の準備

Puttygenで公開鍵のスクリーンをドラッグしてコピー

authorized_keysに公開鍵を貼り付け

cat >> .ssh/authorized_keys

入力モードになるので、(Puttyの場合)Shift + insertボタン押下
Enter
:q + Enter
でプロンプトに戻る

別のPuttyセッションを立上、作成したユーザー名で作成した秘密鍵でログインできることを確認

sftpコマンドでのみ接続を許可させる

authorized_keysの先頭に下記の記載を追加し、改行を入れる。
/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"

あとはこちらの記事を参考にできました。ありがとうございます。

https://qiita.com/rjge/items/221727f010f63be07ff4

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSで簡易なSFTPサーバー構築 - 初期設定

AWSに簡易なSFTPサーバーを立てようとして何度も失敗したので、正しい手順を記録化する話

EC2インスタンスを立てる

立てる過程でKey pair作成

AWSコンソールで、秘密鍵をダウンロード

ローカルマシンにPuttyとPuttygenをインストール

PuttygenでConversionメニューからImport Key. ダウンロードした秘密鍵ファイル.pemを選択。Save private keyで、open-ssh形式の秘密鍵ファイル.ppkを保存

Puttyにセッション作成

AWSコンソールにて対象インスタンスに接続ボタンを押すと表示されるパブリックDNSが接続先DNS
Authに上で作ったOpen SSH形式の秘密鍵.ppkを設定

Open押下でSSHログイン

初期はec2-userであり、rootではない

yum アップデート

$ sudo yum update -y

gitをインストール

'''
$ sudo yum -y install git
'''

Python3をインストール

$ sudo yum install python3

Pyenvのインストール

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

Pathを通す

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

コマンドが通るか確認

$ pyenv -v

必要な依存関係のインストール

$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y

python3.7の場合は以下も必要

sudo yum install libffi-devel

pythonのインストール

pyenv install 3.7.1

バージョンの切替

$ pyenv global 3.7.1
$ pyenv rehash

確認

$ python --version

3.7.1になっていれば成功

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

デバイスファイルのシンボリックリンク作成方法

USB仕様の力センサを2個使いたい時に右と左でそれぞれ個別に認識する方法。

デバイスにはidVendorやserialが割り当てられているので、それらに関する設定を書く。

# FFS055YA501U6 SN: 1803043
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803043", SYMLINK+="fss055ya0"

# FFS055YA501U6 SN: 1803044
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803044", SYMLINK+="fss055ya1"

それぞれのATTRSは

udevadm info -a -n /dev/ttyACM0 | grep idVensor

といったようにATTRS{}の{}の中身でgrepして調べる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Azure WebApps(Linux)で特定ディレクトリをアクセス制限する

Azure WebAppsはデフォルトでアクセス制限機能を持っています。
頻繁にメニューが変更されるのでここだと特定しにくいのですが、2019/03/07時点では『設定』→『ネットワーク』→『アクセス制限』から指定可能です。

しかし、これはサイト全体へのアクセス制限です。

そうではなく、特定のディレクトリだけ制限したい、要するに.htaccessRequire ipって書きたいんじゃという情報が全然見当たらなかったので調べたけどいまいちわからなかったメモ。
そもそもLinux版WebAppsの情報自体少ない。

目的

特定のディレクトリだけ、指定したIPアドレス以外からは接続不可にしたい。

ちなみにOrder deny,allowはもはや古い書き方なので、今後は使わないようにしましょう。

試してみる

.htaccess
Require ip 8.8.8.8

普通のサーバであれば、これでIPアドレス8.8.8.8からの接続は許可、それ以外は拒否されます。

が、WebAppでこう書くと、Allowしたつもりのホストからの接続も拒否されます。

何故かというと、WebAppsのサーバに辿り着く前にREMOTE_ADDRが書き換えられています。
REMOTE_ADDRには本来はクライアントのIPアドレスが入ってくるのですが、WebApp上では172.16.0.1のようなローカルアドレスに書き換えられていました。
元々のIPアドレスはHTTP_X_CLIENT_IPに入っていました。

ということで、接続元IPアドレスとしてHTTP_X_CLIENT_IPを見るようにすれば解決するでしょう。

.htaccess
Require env HTTP_X_CLIENT_IP 8.8.8.8

動きませんでした。

どうやらRequire env環境変数が存在するかどうかしか見ないようです。
従って、一度SetEnvIfで一時変数を作る必要があるみたいです。

.htaccess
SetEnvIf HTTP_X_CLIENT_IP "8.8.8.8" valid_ip
Require env valid_ip

こっちも動かない。

SetEnvIfの引数には一部の環境変数しか指定できないみたいです。
なんで。

解決方法

.htaccess
Require expr http('X-CLIENT-IP') -ipmatch '8.8.8.8'

わかんねーよハゲ。

このhttpとかipmatchとかは公式マニュアルに全く書かれておらず、正規表現の項目にあります。
というか何故変数名がアンダーバーとかハイフンとかCamelCaseとかバラバラなのだ。

あと、この例だと環境変数の頭のHTTP-が勝手に消えるんだけど、HTTP-から始まらない、たとえばSERVER-ADDRあたりを引っかけたい場合はどうすればいいんだろう。
試しにRequire expr req_novary('REQUEST-METHOD') -strmatch 'GET'とか書いてみても動かなかった。

%構文が使えない

正規表現の例では、

.htaccess
<If "%{HTTP_HOST} == 'example.com'">
    Require all denied
</If>

のような例が載っています。
このように、一部の環境変数は%{HOGE}で取得できます。

しかしHTTP_X_CLIENT_IPを使おうとするとInternal Server Errorになります。

.htaccess
<If "%{HTTP_X_CLIENT_IP} != '8.8.8.8'">
    Require all denied
</If>

%構文はSERVER_PROTOCOLやHTTP_USER_AGENTやQUERY_STRINGやHTTP_COOKIEには使用可能。
SERVER_SIGNATUREやHTTP_CONNECTIONやHTTP_X_CLIENT_IPやPHP_SELFには使用不可。

PHP_SELFはともかく、他の使える環境変数と使えない環境変数の違いがわからない。
htaccessに来た時点では定義されてない値とかだろうか。
この違いは何処を見ればわかるのだろう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

httpd.conf中身構成

おはようございます、こんにちわ、こんばんわ

勉強したこと、連携します。何かの役に立てば幸いです

1.設定ファイル(/etc/httpd/conf/httpd.conf)の基本

Apache の設定ファイルは、/etc/httpd/conf/httpd.conf です。この設定ファイルは、大きく 3 つのセクションに分けてディレクティブ(設定項目)が記述されています

セクション壱:Global Environment

Apache サーバープロセスの全般的な制御(グローバルな設定)を行うためのディレクティブを指定する

セクション弐:'Main' server configuration

バーチャルホストでないメインサーバーの設定を行うためのディレクティブを指定する。ここで指定した値は、バーチャルホストの初期値として反映されます。バーチャルホストとは物理的に一台のコンピュータで複数の Web サイトを公開するための機能です

セクション参:Virtual Hosts

各バーチャルホスト毎の設定を行うためのディレクティブを指定する

以上です!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 6にTorqueをセットアップ

CentOS 6にTorqueをセットアップする際のメモ

計算サーバは1台でヘッドノード兼用とする。

http://www.fiatlux.co.jp/faq/build/html/MFmyPresto_Other_Torque.html
の方法でもいいが、ソースビルドしたくないのでyumを使う。

ホスト名が設定されているか

$ hostname

で確認する。
※localhost.localdomainではダメ
※ホスト名が数字から始まっているとダメ

ホスト名からIPアドレスが引けないと問題になるので、予め設定しておいたほうが良い。
IPアドレス: 192.168.0.10
ホスト名: HostA
の場合、/etc/hostsに

192.168.0.10    HostA

を追加する。
※ループバックアドレス(127.0.0.1)ではダメ

# yum install -y epel-release
# yum install -y torque-client torque-mom torque-server torque-scheduler

# create-munge-key

# pbs_server -t create -f -D &
# pbs_server_pid=$!

# kill $pbs_server_pid

# echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes
# hostname > /etc/torque/server_name
# echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout

/var/lib/torque/mom_priv/configが

$pbsserver localhost

になっていたので、

$pbsserver HostA

に変更。

# service munge start
# service pbs_server start
# service trqauthd start
# service pbs_sched start
# service pbs_mom start
# chkconfig munge on
# chkconfig pbs_server on
# chkconfig trqauthd on
# chkconfig pbs_sched on
# chkconfig pbs_mom on

下記コマンドでキューL0を設定する。
キュー名は別の名前でも良い。

# qmgr -c "create queue L0 queue_type=execution"
# qmgr -c "set queue L0 started=true"
# qmgr -c "set queue L0 enabled=true"
# qmgr -c "set queue L0 resources_default.nodes=1"
# qmgr -c "set queue L0 resources_default.walltime=3600"![undefined]()

# qmgr -c "set server default_queue=L0"
# qmgr -c "set server scheduling=true"

# qmgr -c 'p s'

で設定内容を確認する。

# pbsnodes -a

state = free

になっていることを確認。

hostname等設定以降のスクリプト例

#!/bin/bash

set -x

yum install -y epel-release
yum install -y torque-client torque-mom torque-server torque-scheduler

create-munge-key

pbs_server -t create -f -D &
sleep 10
pbs_server_pid=$!
kill $pbs_server_pid

echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes
hostname > /etc/torque/server_name
echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout
sed -i.bak s/localhost/`hostname`/g /var/lib/torque/mom_priv/config

service munge start
service pbs_server start
service trqauthd start
service pbs_sched start
service pbs_mom start
chkconfig munge on
chkconfig pbs_server on
chkconfig trqauthd on
chkconfig pbs_sched on
chkconfig pbs_mom on

qmgr -c "create queue L0 queue_type=execution"
qmgr -c "set queue L0 started=true"
qmgr -c "set queue L0 enabled=true"
qmgr -c "set queue L0 resources_default.nodes=1"
qmgr -c "set queue L0 resources_default.walltime=3600"
qmgr -c "set server default_queue=L0"
qmgr -c "set server scheduling=true"

qmgr -c 'p s'

pbsnodes -a
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ROS自動起動] robot_upstart vs 自分で書く

はじめに

ロボット制御ROSを自動起動する必要があり、ROSパッケージのrobot_upstart
ROSを自動起動するを参考に自分で書く、2パターンでトライしてみましたのでそのメモです。
結論としては、使うデバイスやLaunchファイルの数が少ないシンプルな構成の時はrobot_upstart、デバイスやPermissionが複雑な構成の時は自分で書いた方が幸せになれるように思います。

環境

  • Ubuntu 18.04 (JetPack 4.1.1 Developer Preview)
  • ROS Melodic Morenia
  • Jetson AGX Xavier

比較

どちらも、実施していることはサービスの作成です。なので、robot_upstart特有のトレードオフというよりは「ツールを使うか自作するか」という種の問題に一般的な長所短所があります。

長所 短所
robot_upstart - 導入と使用方法が簡便
- Linux特有の知識はほぼ不要
- 自動化されすぎててデバッグが面倒
自分で書く - 柔軟性が高い
- デバッグが容易
- Linux (Ubuntu)の知識がある程度必要

robot_upstartを使ってみた

robot_upstartの導入は簡単です。わずか一行。

sudo apt-get install ros-<distro>-robot-upstart

次に、自動で起動させたいlaunch fileを登録します。これも簡単。

rosrun robot_upstart install <your_package_name>/launch/<your_launch_file>.launch

これだけで、次回起動時には登録したlaunchファイルが起動するようになります。

robot_upstartのつまづきポイント

ログの出力先がドキュメントと異なる。

たぶんドキュメントが更新されてないだけだと思いますが、私の環境ではドキュメントに書いてある/var/log/upstartではなく/var/log/syslogに出力されていました。

環境変数の設定

setuidgidで直接roslaunchを叩いているためか.bash_profile.bashrcが読み込まれないので、必要な環境変数が無かったり意図しない値になってたりすることがあります。
こちらにあるように、必要な設定を書いた.robotrcなどの適当なファイルを作って/opt/ros/<distro>/setup.bash<your_catkin_ws>/devel/setup.bashからsource path/to/your/fileしてあげるのが良いようです。

【参考】
ログインシェルとインタラクティブシェルと~/.bashrc達の関係
How to reference environmental variables inside an upstart installed launch file

CUDAがエラーになる(未解決)

CPUオンリーのノード群は問題なく上記の設定で動いたのですが、私の環境ではCUDAを使っているノードがエラーでコケてしまい立ち上がりませんでした。
おそらく何かのPermissionが適切に設定されてないためだと思うのですが、未解決です。

自分で書いてみた

一見とっつきづらいですが、ROSを自動起動するを参考に書いていくと意外と簡単に書けました。
非常にわかりやすい記事を書いてくださった@strv様に感謝です。

robot_upstartで直面したCUDAエラーもこちらでは発生しなかったので、私は現在こちらを使用しています。

自分で書いた場合のつまづきポイント

デバイスをsystemdで利用可能にする

systemdで利用可能なデバイス名については、
systemctl --t device -a --full
で確認することが出来ます。

とありますが、デバイスによってはデフォルトのままだとこのリストに出てこないことがあります。
そういう時は、該当するデバイスのudevルールにTAG+="systemd"を追加してあげましょう。
既存のルールが無い場合は自分で作成しても大丈夫です。私の場合は下記のようなudevルールを用意しました。

SUBSYSTEM=="hidraw", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", TAG+="systemd", SYMLINK+="sensor_device%n", MODE="0666"

【参考】
Raspberry Pi 2 + systemd + udevで、USBデバイス挿入時にサービスを起動するLinux でデバイスを接続している時だけ動くサービスを作る

roscoreの検出

元記事だとExecStartPre=/bin/bash -l -c 'rostopic list'でroscoreの検出を行っていますが、このやり方だとrostopic listが失敗した時点でサービス自体が落ちるので、後ろに書いてあるRestart=alwaysとの合わせ技で成立しています。

ExecStartPre=/bin/bash -l -c 'rostopic list'
<中略>
Restart=always

元々の方針としてRestart=alwaysであるlaunchファイルならこのやり方が良いと思いますが、私の場合は多数のデバイスが絡むlaunchファイルになっていて頻繁に再起動するような仕様にしたくなかったのでRestart=noにしています。
この場合rostopic listでのroscore検出が出来ないので、元記事のコメントにあるようにroslaunch --waitオプションで待ってあげる必要があります。

ExecStart=/usr/bin/screen -S mavros -ADm bash -l -c 'roslaunch --wait mavros px4.launch'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

かゆいところに・・・

Linuxコマンド

隠しディレクトリ含め容量を計算

du -scm {ディレクトリパス} {ディレクトリパス}.[^.]* | sort -rn

〜日前ファイル削除

find {ディレクトリパス}} -mtime +30 -name "*.log" -type f -exec rm -f {} \;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

systemctl メモ

サービスの一覧を確認、起動、停止する手順のメモ

定義されているサービスを全て確認

systemctl list-unit-files --type=service

起動中のサービスを全て確認

systemctl list-units --type=service

特定のサービスのステータスを確認

systemctl status [サービス名]

サービスを起動する

systemctl start [サービス名]

サービスを停止する

systemctl stop [サービス名]

サービスの自動起動を有効にする

systemctl enable [サービス名]

サービスの自動起動を無効にする

systemctl disable [サービス名]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む