SFTPのみ接続可。sshでのシェルは排除。

設定は以下のようにする。

# groupadd sftp_users

# usermod -G sftp_users mokyu

# vi /etc/ssh/sshd_config
147行目コメント化にしてその下に追記します


# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
#SFTP Chroot化専用設定(最終行に追記)
Match Group sftp_users
   X11Forwarding no
   AllowTcpForwarding no
   ChrootDirectory /home
   ForceCommand internal-sftp

pcmemorin.blog.fc2.com

また、rsshを利用すると、scpやsftpなどコマンドを制約した使い方できるようになる。

rsshによるセキュアなファイル転送

references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use themが出た

このメッセージが出た場合は最初のcreatetableの際に変な設定が入っていることがある。
具体的に言うと後で全部の権限をuserに付与しても中のテーブルは特定のユーザしか見れなくなっている。
dumpしてloadした後にこのようなメッセージが出れば、以下の動作を行えばいい。

CREATE ALGORITHM=UNDEFINED DEFINER=`hoge1`@`%` SQL SECURITY DEFINER VIEW `view_count` AS ...

↓

CREATE ALGORITHM=UNDEFINED DEFINER=`hoge2`@`%` SQL SECURITY DEFINER VIEW `view_count` AS ...

qiita.com

Apacheのアクセス制限について

そもそもアクセス制限について、Apacheの制御もしくはファイヤーウォールなどの外部機器での制御(iptable)がある。 ファイヤーウォールはインフラに含まれるんだなあと思いました。

mod_authz_core - Apache HTTP Server Version 2.4

tupleプルプル

tupleは一旦作成すると、値を変更できないけど、

"%s, %s" % tuple("hoge", "koge")

のようについ変えられる。

追加で、ディレクトリを再帰的に取得するには下のようにすればいい。便利

$ grep -r 検索文字列 ディレクトリ

tigawa.github.io

Mysqlのデータを変更する(MySQL-python==1.2.5)

データベースのqueryを整形する。データベースに突っ込む前に"をつけるのが必要なのとないのがあって訳わからん。 ついでにutf-8に変換しないといけないのと、conn.commit()しないとinsertが反映されないということでばりつまづいた。

# -*- coding: utf-8 -*-
# vim:tabstop=4:shiftwidth=4:expandtab

import sys
import MySQLdb
from datetime import datetime, timedelta
import argparse


def alter_sql_query(conn, day):
    date = datetime.strptime(day, "%Y%m%d")
    next_day = date + timedelta(days=1)
    cur = conn.cursor()
    try:
        sql = '''
            SELECT `[id]`, `[date]`, `[query]`
            FROM `[table名]`
            WHERE `[date]` >= \"{day}\"
            AND `[date]` < \"{next_day}\"
        '''.format(day=date.strftime("%Y-%m-%d"), next_day=next_day.strftime("%Y-%m-%d"))
        cur.execute(sql)
        rows = []
        ori_rows = cur.fetchall()
        for row in ori_rows:
            # [それなりの処理、"をつけたりつけなかったり。datetimeは放置で大丈夫な感じ]
            rows.append(tuple(row))
        bind = ','.join([
            '({0})'.format(','.join(['%s'] * 3))
        ] * len(rows))
        sql = '''
            INSERT INTO `[table名]` (`[id]`, `[date]`, `query`)
            VALUE {bind}
            ON DUPLICATE KEY UPDATE `query` = VALUES(`query`)
        '''.format(bind=bind, )
        params = []
        for v in rows:
            params.extend(v)
        # import pdb; pdb.set_trace()
        cur.execute(sql, params)
    except Exception as e1:
        raise e1
    finally:
        cur.close()


def execute(day):
    conn = MySQLdb.connect(host="127.0.0.1", db="zoff", user="zoff", passwd="zoff", charset="utf8")

    check = raw_input('(yes/no): ')
    if check != "yes":
        sys.exit(0)
    alter_sql_query(conn, day)
    conn.commit()
    conn.close()


if __name__ == '__main__':
    print 'the operation start', datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    parser = argparse.ArgumentParser()
    parser.add_argument('-d', action='store', dest='day',
                        help='checkday')
    day = parser.parse_args().day
    execute(day)
    print 'the operation finish', datetime.now().strftime("%Y-%m-%d %H:%M:%S")

rishida.hatenablog.com