2022年3月30日 星期三

Ubuntu Crontab 排程執行設定

輸入sudo crontab -e
進入如下crontab 設定畫面

下例設定為每天17點執行 launcher.sh 這個檔案,並將執行紀錄寫入 /logs/cronlog.txt 
00 17 * * * sudo sh /home/ubuntu/launcher.sh > home/ubuntu/logs/cronlog.txt 2>&1


設定參數為 mm hh dom (day of month) mom(month) dow(day of week),
若要設定每週一的17:30分執行,則如下: 
30 17 * * 1 sudo .....
可貼到這個crontab grur進行確認。

檢視crontab 是否執行
輸入:
grep CRON /var/log/syslog*

查看所設定時間點的動作,如下圖:
在4:00:01 出現(CRON) info (No MTA installed, discarding output)

查看原設定的logs/檔案不存在,因此檢查cronlog的設定是否正常。
sudo nano /etc/rsyslog.d/50-default.conf
- 移除cron.log 前面的註解


重新啟動syslog服務
sudo /etc/init.d/rsyslog restart
重新啟動cron服務
sudo service cron restart

2021年1月5日 星期二

數莓派 遠端連線固定IP設定

網路設定檔案路徑: /etc/dhcpcd.conf 

打開檔案後可以看到如下範例的段落:

# Example static IP configuration:

#interface eth0

interface eth0

static ip_address=192.168.2.188

#static ip_address=192.168.0.10/24

#static ip6_address=fd51:42f8:caae:d92e::ff/64

#static routers=192.168.0.1

#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1


interface eth0 指的是有線網路卡

static ip_address=192.168.xx.xx 就根據要連線的電腦網段去設定。


例如我要連線的電腦網段是192.168.2.xx,就將數莓派有線網路卡IP設為192.168.2.188;

後續樹莓派只要連上網路線,其他電腦就可以直接ssh或VNC這個IP連到數莓派了。


若要設定的是無線網路IP,就將eth0 改為wlan0。

但若會使用多個無線網路,例如:家裡、辦公室、手機網路,可能就會發生IP衝突或網段不同的問題。


*查看數莓派目前網路參數

$sudo ifconfig


安裝windows 遠端桌面

sudo apt-get -y install xrdp

2020年11月16日 星期一

數莓派 透過macbook網路連線數莓派

MAC上需要安裝nmap來查詢連線的數莓派IP

- 進入終端機輸入:

- brew install nmap

然後到 mac 系統偏好設定> 網路

-啟用網路DHCP,會需要跑一陣子,當IP出現後表示已連線數莓派(數莓派要先開機)



接著到mac 系統偏好設定> 共享

-啟用Internet共享給數莓派


回到終端機先查詢本機IP

- $ifconfig

- 會列出很多裝置的位置,但這邊要查的是網路線裝置的位置如下bridge100,可以在Inet中看到192.168.2.1



使用nmap查詢數莓派位置

- 因為已經知道DHCP分享的本機位置了,數莓派會在同網段

- $sudo nmap -n -sP 192.168.2.1/255

- 就會看到他列出192.168.2.2的數莓派IP


接下來可以透過SSH或VNC連線數莓派

SSH連線:

- $ ssh pi@[ip] 

- 再輸入密碼


VNC連線:

- finder>前往>連線伺服器

- vnc://IP

詳見mac VNC連線

數莓派 mac VNC 連線Pi4 (解決VNC 版本不相容問題)

數莓派要先安裝vncserver, Viwer

sudo apt-get install realvnc-vnc-server real-vnc-viewer


安裝後變更數莓派VNC介面設定為啟用


啟用VNC server

$sudo raspi-config

- 選擇Interface Option

- 選擇VNC,然後確認啟用




進入VNC設定視窗

- 點擊數莓派視窗右上角的 VNC Icon

- 順便記一下數莓派的IP


變更驗證方式(就是這一步導致mac出現版本不相容問題)

- 點擊視窗中右上角選單的Option,在security選項中將Authentication改成VNC password

- 預設為UNIX password,但在mac上會出現版本不符無法連線的問題



回到Mac中的finder,前往> 連接伺服器

-vnc://[數莓派IP位置]


就可以遠端連到數莓派畫面了


若數莓派桌面未顯示VNC 圖示,則需要先安裝VNC Viewer

啟動VNC

-sudo raspi-config > interface 啟動vnc server

安裝vnc server

-sudo apt-get install realvnc-vnc-server

設定VNC密碼

-sudo vncpasswd -service

設定VNC驗證方式

-sudo nano /etc/vnc/config.d/common.custom

-加入 Authentication=VncAuth (ctrl X 存檔離開)

重新啟動服務

-sudo systemctl restart vncserver-x11-serviced


* 另外一個方式是 從Mac下載realVNC Client,安裝完畢後就可以透過VNC Client 連線了

2020年10月15日 星期四

Ubuntu 18.04 使用php ssmtp發送信件,以gamil為例

前置作業
- 確認環境的Port有開通,例如: 25、465、587是通的

安裝ssmtp 
sudo apt-get install ssmtp

設定sstmp config
sudo vi /etc/ssmtp/ssmtp.conf

修改如下設定
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
# 設定要用的轉寄信箱
root=[例:test@gmail.com]
# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
# 信箱SMTP位置
mailhub=[例:smtp.gmail.com:587]
#輸入以下登入驗證帳號/密碼
AuthUser=[例:sender@gmail.com]
AuthPass=[例:test@password]
#根據轉寄信規則選擇是否使用TLS、SSL
UseTLS=YES
UseSTARTTLS=NO
# Where will the mail seem to come from?
#輸入信箱網域名稱
rewriteDomain=[例:gmail.com]
# The full hostname
#主機名稱
hostname=[主機名稱]
# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

新增php測試mail程式testmail.php
sudo vi /var/www/html/testmail.php

新增以下程式碼
<?php
$to="[例:test@mail.com]";
$subject="[例:這是主旨]";
$msg="[例:這是內文]";
$headers="From: [例:sender@gmail.com]";
if(mail("$to","$subject", "$msg", "$headers"))
        echo "send";
else
        echo "fail";
?>

測試
-到瀏覽器輸入[主機位置]/testmail.php,測試php程式;應該就會在php程式中to=的信箱收到信件

可查看寄送的mail log,判斷是否有問題;有可能因為驗證錯誤或網路問題而導致沒收到信
sudo tail /var/log/mail.log

(以上是在php7.2版本執行,不太確定是否其他版本還有其他需要的設定)

2020年9月24日 星期四

Ubuntu 18.04. 安裝php7.2, mysql


安裝php:

sudo apt update

安裝php相關套件:

sudo apt install php php-cli php-fpm php-json php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath

查看php版本:

php -v

Ubuntu18.04的php會預設為php7.2版本。


安裝mysql

sudo apt install mysql-server 

sudo apt install mariadb-server-core(安裝在數莓派上要用這個)

安裝後預設密碼空白,需要修改mysql root 密碼

sudo mysql -uroot -p 

進入mysql後輸入以下指令來設定root帳號密碼

mysql>SET PASSWORD FOR 'root'@'localhost' = PASSWORD('pi&metrackPI');

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('pi&metrackPI');


>flush privileges;


變更密碼指令:

SET PASSWORD FOR '[帳號]'@'localhost' = PASSWORD('[密碼]');


修改mySQL設定
- 預設MySQL是只允許本機存取,因此要修改成允許遠端存取
-  sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
-  將blind-address這一行的IP改成自己要遠端的IP,若不限制可以加上#註解掉
-在[mysqld]區塊中加上character-set-server=utf8 

啟動mySQL
-輸入指令:sudo systemctl start mysql
- 查看運作狀況service mysql status


安裝phpmyadmin

sudo apt install phpmyadmin

php7.2以後的phpmyadmin有些問題,因此都會出現錯誤訊息;小弟尚未查到完整修改的方式,

但因為不引響實際網站存取資料庫問題,因此就先不管了。

若朋友有解法分享,小弟萬分感謝。

設定phpmyadmin連結網址:

sudo ln -s /usr/share/phpmyadmin /var/www/html/[例:phpmyadmin]


設定mysql使用者允許遠端連線(視需求設定)

若mysql在遠端環境,則需要允許遠端連線,可將以下指令IP改為%,或指定特定IP,若為本機用戶則輸入localhost。

允許遠端連線帳號權限,進入mysql後

mysql>GRANT ALL PRIVILEGES ON *.* TO '[帳號]'@'IP' IDENTIFIED BY '[密碼]';

更新權限

mysql>flush privileges;


PS. 若是由程式讀取本機資料庫,使用者可設定為Localhost,程式端的資料庫位置也要localhost才行。


2020年8月6日 星期四

JQuery ajax post, php接收,回傳資料

花了些時間研究圖片上傳功能。
前端將圖片轉成Base64後,透過ajax post傳到後端php程式,由程式寫入資料庫並產生圖片路徑,再回傳圖片路徑資料給前端。

前端程式:
Head設定語系跟載入jquery
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
</head>

HTML:包含一個編號、一個選擇圖片功能,一個上傳按鈕,還有一個顯示回傳資料的欄位
<html>
    <form>
        <label> 編號
            <input id="pid" type="text"/>
        </label>
        <label> 圖檔:</label>
        <label class="btn_img">請選擇圖片
            <input id="upload_img" type="file">
        </label>
        <div class="edit_form_img">
            <img id="img_preview" />
        </div>
        <input id="sent" class="form_submit" type="button" value="submit" ></input>
    </form>
    <label id="info"></label>
</html>

JS:將選擇的圖片轉成base64並產生預覽
    $("#upload_img").change(function() {
        //readURL(this);//互叫變更預覽圖片的功能
        //取得file選擇的檔案
        pv_img = $("#upload_img").get(0).files[0];
        //新增reader物件轉成base64資料,再onload時寫入圖片的scr
        var reader = new FileReader();
        reader.onload=function(){
            $("#img_preview").attr('src',reader.result);
        }
        reader.readAsDataURL(pv_img);
    });

JS 當上傳按鈕被點擊後,取得資料,並透過ajax Post到php
-這裡偷懶取代base64資料前的資料描述文字,但比較好的作法應該是要另外存檔案格式,之後轉回圖片時再加上附檔名(這動作可以在php端處理,也可以在前端)
-processData這個參數有點神奇,當true時data參數才能正確傳到php端,false就不行了;但網路上有些範例卻說要用false。若有大大知道原理,還忘不吝告知,感恩喔!
-data的傳送方式試過傳送form序列化或json.stringfy,但資料還是送不出去;這邊提供傳送成功的方式跟php接收的程式有關係。
- 取回php回傳的陣列資料,先抓兩個欄位顯示出來。

    $('#sent').click(function(){
        img64=$("#img_preview").attr("src");
        sb64=img64;
        //取代編碼後前面的描述文字
        sb64= sb64.replace("data:image/jpeg;base64,",''); 
        $.ajax({
            url:'jsonPHP.php',
            type: 'POST',
            processData: true, //false時,data參數無法傳到php POST接收端,true時才可以
            dataType: "json",
            //傳送data參數值
            data: { 'pid':$("#pid").val(),     
                    'sb64':sb64
                },
            success: function(data){
                console.log(data);
                //取回php回傳的陣列資料
                    var imgsNum=data.length;
                    for (i=0;i<imgsNum;i++){
                        imgid=data[i]['img_id'];
                        imgurl=data[i]['img_url'];
                        $("#info").append("id:"+imgid+"|url:"+imgurl);
                    }
                },
        });  
    });

PHP程式
- 取得前端傳遞的資料後,呼叫寫入資料的程式,再透過查詢回傳同個編號的圖片資料
- Insert_img 先將base64資料轉成圖片,我去抓一個時間當作檔名(這是另外引入的函式),再將資料存到資料庫
- query_img查詢同個ID的資料,存成陣列後回傳。


<?php
    header('Content-Type: application/json; charset=UTF-8');
    require_once("fundation_func.php");
    $link = new mysqli($dbhost,$dbuser,$dbpass,$db);

    //偵測POST的資料與前端ajax參數有關,要對應才行
    if ($_SERVER['REQUEST_METHOD'] == "POST"){
        @$id=$_POST["pid"];
        //@$name=$_POST["name"];
        @$sb64=$_POST["sb64"];
        $msg="取得pid:".$id;
        echo json_encode(insert_img($link, $id,$sb64));
    }else
    {
        $msg="request錯誤";
        echo json_encode(array(
            'msg'=> $msg
        ));
    }

    function insert_img($link,$product_id,$sb64){
        //產生圖片路徑
        $img_file=base64_decode($sb64);
        $file_name=get_pure_text(get_file_no());
        $file_url="product_imgs/".$product_id."_".$file_name.".jpg";
        file_put_contents($file_url, $img_file);

        //新增產品圖片資料的SQL
            $sql="INSERT INTO product_img(product_id, imgb, img_url) VALUES ('$product_id','$sb64','$file_url')";
            $link->query($sql);
        //查詢產品圖片
        return query_img($link,$product_id);
    }

//查詢同個ID的圖片函式,會回傳一個陣列
    function query_img($link,$product_id){
        $imgs_array=array(
            array('img_id','img_url'),
        );
        $sql="SELECT img_id, img_url FROM product_img WHERE product_id=$product_id";
        $result=$link->query($sql);
            $i=0;
            while($row=$result->fetch_array(MYSQLI_ASSOC)){
                //將查到的產品圖片存到array中
                $imgs_array[$i]=array(
                        'msg'=>"ss",
                        'img_id'=>$row['img_id'],
                        'img_url'=>$row['img_url']
                );
                $i++;
            }
            return $imgs_array;
    }
?>