[php] PHPMailer 로 외부 SMTP 활용하여 메일 보내기

프로그래밍/PHP|2024. 2. 8. 08:25
반응형

PHP 를 사용하여 SMTP 를 통해 이메일을 보내는 방법은 PHPMailer 와 같은 외부 라이브러리를 사용하는 것이 편리합니다. 다음은 PHPMailer 를 사용한 간단한 예제입니다.

먼저, PHPMailer 다운로드를 위해 composer 를 설치 합니다.

# apt -y install composer    // Ubuntu 의 경우

 

메일 발송을 위한 프로젝트 디렉토리를 생성하고 그 안에서 PHPMailer 를 다운로드 합니다.

작성일 기준으로 6.9.1 버전이 설치됩니다.

# mkdir mail_app
# cd mail_app
# composer require phpmailer/phpmailer

Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
Using version ^6.9 for phpmailer/phpmailer
./composer.json has been created
Running composer update phpmailer/phpmailer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking phpmailer/phpmailer (v6.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing phpmailer/phpmailer (v6.9.1): Extracting archive
7 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

 

메일 발송을 위해 아래 내용으로 PHP 소스 코드를 작성합니다.

아래는 SSL 를 사용하지 않고 발송하는 예제입니다.

# vi send.php

<?php
// PHPMailer 라이브러리 사용
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

// PHPMailer 인스턴스 생성
$mail = new PHPMailer(true);

try {
    // SMTP 서버 설정
    $mail->isSMTP();
    $mail->Host = 'mail.sysdocu.kr';
    $mail->Username = 'admin@sysdocu.kr';
    $mail->Password = '12345678';
    $mail->SMTPSecure = false;
    $mail->SMTPAutoTLS = false;
    $mail->Port = 25;
    //$mail->SMTPDebug = 2;  // 디버그 레벨 (0은 디버그 비활성화, 2는 상세 디버그)

    // 발신자, 수신자, 참조, 숨은 참조
    $mail->setFrom('admin@sysdocu.kr', '관리자');
    $mail->addAddress('sysdocu@sysdocu.kr');
    //$mail->addCC('user@sysdocu.kr');
    //$mail->addBCC('manager@sysdocu.kr');

    // 파일 첨부
    //$mail->addAttachment('/tmp/file.zip');

    // 메일 내용 설정
    $mail->isHTML(true);
    $mail->CharSet = 'UTF-8';
    $mail->Subject = '메일 제목입니다.';
    $mail->Body    = '메일 <b>내용</b>입니다. 잘 발송이 되었나요?';
    $mail->AltBody = 'HTML 미지원 환경에서는 내용이 보이지 않습니다.';

    // 메일 전송
    $mail->send();
    echo 'The Email has been sent successfully.';
} catch (Exception $e) {
    echo "Email could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>

 

작성한 php 파일을 실행하여 메일을 발송합니다.

# php send.php

 

* 참고 1

외부 SMTP 를 사용할 때 아래와 같이 설정하는 경우도 있으니 참고하시기 바랍니다.

    // SMTP 서버 설정
    $mail->isSMTP();
    $mail->Host = 'gw.sysdocu.kr';
    $mail->SMTPAuth = true;
    $mail->Username = 'admin@sysdocu.kr';
    $mail->Password = 'Mm*nBFu2Pt%qjNf@XLc7e9H1V6CIa(zr';
    $mail->SMTPSecure = false;
    $mail->SMTPAutoTLS = false;
    $mail->Port = 587;

 

* 참고 2

발송이 되지 않을 경우 SMTP 서버에서 메일 발송 IP (send.php 실행 IP : 115.68.142.120) 를 Relay 설정 하였는지 확인합니다.

예) Sendmail 의 경우

# echo "Connect:115.68.142.120 RELAY" >> /etc/mail/access

# makemap hash /etc/mail/access.db < /etc/mail/access

# systemctl restart sendmail

 

반응형

댓글()

[C++] 파일쓰기 예제

프로그래밍/C, C++|2023. 12. 11. 17:02
반응형

#include<fstream>
#include<iostream>
#include<string>
 
using namespace std;
 
int main() {
    fstream my_file;
    my_file.open("a.txt", ios::out);    // 이 파일이 생성됩니다.
    my_file << "test" << endl;           // test 라는 내용이 들어가며
    my_file.write("12345", 5);           // 이렇게도 추가할 수 있습니다.
    my_file.close();
}

 

 

* 참고로 위 코드는 반복 실행시 계속 새로운 파일로 쓰이게 되며,

파일이 있을때 내용을 추가하고자 할경우 아래와 같이 ios::app (append) 플래그를 사용하면 됩니다.

my_file.open("a.txt", ios::out | ios::app);

 

반응형

댓글()

Rocky Linux 9.x, PHP 8.1.x 환경에서 Laravel 10.33.0 설치하기

프로그래밍/PHP|2023. 11. 23. 13:55
반응형

테스트 환경은 Rocky Linux 9.x 버전이고, Laravel 10.33.0 버전을 설치하기 전에 PHP 8.1.x 버전을 설치해 두었습니다.

Laravel 은 Composer 를 통해 설치합니다.

 

 

1. Composer 다운로드

 

아래 홈페이지에서 Composer 를 다운로드 받을 수 있습니다.

자세한 정보 확인이 가능하지만 설치만 간단히 하고 싶은 분은 아래 명령어만 수행해도 됩니다.

https://getcomposer.org/

 

현재 디렉토리에 인스톨러를 다운로드 합니다.

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

 

인스톨러가 정상인지 검증합니다.

# php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Installer verified

 

인스톨러 파일을 실행해 Composer 를 생성합니다.

# php composer-setup.php

All settings correct for using Composer
Downloading...

Composer (version 2.6.5) successfully installed to: /home/fntop/public_html/tool/composer.phar
Use it: php composer.phar

 

인스톨러 파일을 삭제합니다.

# php -r "unlink('composer-setup.php');"

 

composer.phar 파일 이름을 composer 로 변경해주고, 디렉토리 어디에서든 실행 할 수 있도록 파일을 옮겨줍니다.

# mv composer.phar /usr/local/bin/composer

 

설치된 Composer 버전을 확인합니다.

# composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.6.5 2023-10-06 10:11:52
...

(생략)

 

 

2. Laravel 프로젝트 생성

 

Laravel 을 설치 합니다. 설치시 프로젝트명을 지정하면 프로젝트명의 하위디렉토리가 생성되며,

Laravel 버전을 명시하지 않으면 최상위 버전으로 설치됩니다.

형식) composer create-project --prefer-dist laravel/laravel {프로젝트명} "{Laravel버전}"

# composer create-project --prefer-dist laravel/laravel sysdocu            // Laravel 최신 버전으로 프로젝트 생성

또는

# composer create-project --prefer-dist laravel/laravel sysdocu "9.*"    // Laravel 9.x 버전으로 프로젝트 생성

 

여기에서는 최신 버전으로 생성해 보겠습니다.

# composer create-project --prefer-dist laravel/laravel sysdocu
Creating a "laravel/laravel" project at "./sysdocu"
Installing laravel/laravel (v10.2.9)
  - Installing laravel/laravel (v10.2.9): Extracting archive
Created project in /home/fntop/public_html/tool/blog1/sysdocu
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 110 installs, 0 updates, 0 removals
  - Locking brick/math (0.11.0)
  - Locking dflydev/dot-access-data (v3.0.2)
  - Locking doctrine/inflector (2.0.8)
  - Locking doctrine/lexer (3.0.0)
  - Locking dragonmantank/cron-expression (v3.3.3)
  - Locking egulias/email-validator (4.0.2)
  - Locking fakerphp/faker (v1.23.0)

...

(생략)

...

   INFO  Application key set successfully.

 

생성된 파일을 확인합니다.

# cd sysdocu
# ls -al
합계 356
drwxr-xr-x 12 root root   4096 11월 23 13:34 .
drwxr-xr-x 13 root root   4096 11월 23 13:34 ..
-rw-r--r--  1 root root    258 11월 14 01:36 .editorconfig
-rw-r--r--  1 root root   1148 11월 23 13:34 .env
-rw-r--r--  1 root root   1097 11월 14 01:36 .env.example
-rw-r--r--  1 root root    186 11월 14 01:36 .gitattributes
-rw-r--r--  1 root root    243 11월 14 01:36 .gitignore
-rw-r--r--  1 root root   4106 11월 14 01:36 README.md
drwxr-xr-x  7 root root     82 11월 14 01:36 app
-rwxr-xr-x  1 root root   1686 11월 14 01:36 artisan
drwxr-xr-x  3 root root     34 11월 14 01:36 bootstrap
-rw-r--r--  1 root root   1882 11월 14 01:36 composer.json
-rw-r--r--  1 root root 296306 11월 23 13:34 composer.lock
drwxr-xr-x  2 root root   4096 11월 14 01:36 config
drwxr-xr-x  5 root root     74 11월 14 01:36 database
-rw-r--r--  1 root root    248 11월 14 01:36 package.json
-rw-r--r--  1 root root   1084 11월 14 01:36 phpunit.xml
drwxr-xr-x  2 root root     77 11월 14 01:36 public
drwxr-xr-x  5 root root     40 11월 14 01:36 resources
drwxr-xr-x  2 root root     75 11월 14 01:36 routes
drwxr-xr-x  5 root root     46 11월 14 01:36 storage
drwxr-xr-x  4 root root     83 11월 14 01:36 tests
drwxr-xr-x 39 root root   4096 11월 23 13:34 vendor
-rw-r--r--  1 root root    263 11월 14 01:36 vite.config.js

 

설치된 Laravel 버전을 확인합니다.

# php artisan --version
Laravel Framework 10.33.0

 

 

3. 생성 페이지 접근

 

현재 디렉토리에서 php 명령을 이용해 기본 생성 페이지에 접근해 봅니다.

# php artisan serve --host=0.0.0.0

 

   INFO  Server running on [http://0.0.0.0:8000].  

  Press Ctrl+C to stop the server

8000 번 포트로 모든 IP 에서 접근할 수 있도록 했습니다.

방화벽에서 8000 번 포트가 열려있는지 확인하고,

웹브라우저에서 아래와 같이 서버 IP (또는 Domain) 에 포트 번호만 붙여 접근해 보면 라라벨 초기페이지가 출력됩니다.

> http://sysdocu.kr:8000

 

반응형

댓글()

PHP 코드를 실행해주는 사이트 (버전 선택 가능)

프로그래밍/PHP|2023. 11. 17. 14:52
반응형

http://phptester.net/

 

반응형

댓글()

[Android] APNG 사용하기

프로그래밍/ANDROID|2023. 8. 24. 08:10
반응형

움직이는 GIF 파일과 같이 움직이는 PNG 파일인 APNG 입니다.

GIF 보다 용량도 작고 고화질로 출력이 가능해 안드로이드의 아이콘이나 버튼으로 사용하기 좋습니다.

 

라이브러리 :  https://github.com/penfeizhou/APNG4Android

 

1. 준비

build.gradle 파일에 dependency 를 추가합니다.

...

repositories {
    mavenCentral()
}


...

APNG
dependencies {
    implementation 'com.github.penfeizhou.android.animation:apng:${VERSION}'
}


...

 

2. 사용

APNG 파일 (예: sysdocu.png) 은 assets 폴더에 저장합니다.

...

// asset 파일에서 불러오기
AssetStreamLoader assetLoader = new AssetStreamLoader(context, "sysdocu.png");

// APNG Drawable 생성
APNGDrawable apngDrawable = new APNGDrawable(assetLoader);

// 자동 실행
imageView.setImageDrawable(apngDrawable);

...

 

반응형

댓글()

PHP 소켓 (server.php, client.php) - 데이터 전달 예제

프로그래밍/PHP|2023. 7. 7. 12:47
반응형

PHP 를 이용해 Server 에서 소켓 파일을 만들어 실행한 상태에서 Client 가 데이터를 전달하는 예제입니다.

데이터 (Mac address) 를 보내면 Server 측에서 데이터 검증 후 출력하도록 작성하였습니다.

받은 데이터 로그는 /root/input_data.log 에 기록 됩니다.

 

# vi server.php

#!/usr/bin/php -q
<?php
set_time_limit(0);

define("_IP",    "0.0.0.0");
define("_PORT",  "80");

$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sSock, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);

pcntl_signal(SIGCHLD, SIG_IGN); 

function msg($msg) {
    echo "SERVER >> ".$msg;
}

// 맥어드레스 형식 검증
function isMacAddress($str) {
    $pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/';
    return preg_match($pattern, $str);
}

while($sock = socket_accept($sSock)) {
    socket_getpeername($sock, $sockIp, $sockPort);
    msg("Client connect : ".$sockIp.":".$sockPort."\n");

    // 자식 프로세스 생성
    $pid = pcntl_fork();
    if($pid == -1) {
        msg("fork failed\n");
        exit;
    }
    if($pid == 0) {
        $input = socket_read($sock, 4096);

        // 헤더와 데이터 분리
        list($header, $data) = explode("\r\n\r\n", $input, 2);
        msg("Mac address : " . $data . "\n");

        // 결과 응답 및 Client 연결 해제
        if ($input != "") {
            socket_write($sock, "Received it well");
            msg("Client disconnect : ".$sockIp.":".$sockPort."\n");
            socket_close($sock);
        }

        // 데이터 검증
        if (isMacAddress($data)) {
            $validation = "OK";
        } else {
            $validation = "NotOK";
        }

        // 로그 기록
        $now = date("Y-m-d H:i:s");
        shell_exec("echo \"$now\" \"$data\" \"$validation\" >> /root/input_data.log");
        exit;
    }
}
?> 

 

맨 윗줄 #!/usr/bin/php -q 에는 실제 php 실행파일 경로를 적어줘야 합니다.

 

root 만 사용할 수 있도록 권한을 변경합니다.

# chmod 700 server.php

 

파일을 실행하여 80 포트를 오픈하고 client 의 수신을 대기합니다.

# php server.php

 

Client 파일을 만듭니다.

# vi client.php

<?php
$url = 'http://www.sysdocu.kr';    // 접속할 호스트명
$data = '00:d8:61:13:2a:b8';       // 전달하고 싶은 데이터 (여기에서는 Mac address)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);
?>

 

Server 측 소켓이 열린 상태에서 client.php 파일을 실행하면 미리 준비된 데이터가 전달 됩니다.

# php client.php

 

반응형

댓글()

C/C++ 프로그레스바 (ProgressBar)

프로그래밍/C, C++|2023. 6. 16. 07:57
반응형

C/C++의 콘솔 환경에서 프로그레스바 (진행바) 구현 소스입니다.

아래와 같이 심플하게 개수, 프로그레스바, 진행률 이 출력됩니다.

 

10/10 [==================================================] 100%

 

#include <stdio.h>
#include <stdlib.h>  
#include <windows.h> // Sleep 함수 

int main() {
        const char bar = '='; // 프로그레스바 문자  
        const char blank = ' '; // 비어있는 프로그레스바 문자  
        const int LEN = 20; // 프로그레스바 길이  
        const int MAX = 1000; // 진행작업 최대값 
        const int SPEED = 50; // 카운트 증가 대기시간  
        int count = 0; // 현재 진행된 작업  
        int i; // 반복문 전용 변수  
        float tick = (float)100/LEN; // 몇 %마다 프로그레스바 추가할지 계산 
        printf("%0.2f%% 마다 bar 1개 출력\n\n", tick); 
        int bar_count; // 프로그레스바 갯수 저장 변수  
        float percent; // 퍼센트 저장 변수  
        while(count <= MAX) {
                printf("\r%d/%d [", count, MAX); // 진행 상태 출력  
                percent = (float)count/MAX*100; // 퍼센트 계산  
                bar_count = percent/tick; // 프로그레스바 갯수 계산  
                for(i=0; i<LEN; i++) { // LEN길이의 프로그레스바 출력  
                        if(bar_count > i) { // 프로그레스바 길이보다 i가 작으면 
                                printf("%c", bar);
                        } else { // i가 더 커지면  
                                printf("%c", blank);
                        }
                }
                printf("] %0.2f%%", percent); // 퍼센트 출력  
                count++; // 카운트 1증가  
                Sleep(SPEED); // SPEEDms 대기  
        }
        printf(" done!\n\n");
        system("pause"); // 프로그램 종료 전 일시정지  
        return 0; 
}

 

1000개의 전체 작업량 중 1개가 완료되었다면 진행률은 0.1%가 됩니다.
현재 진행량/전체 진행량 * 100 = 진행률(%)
100분율 계산법입니다.
해당 연산은 코드의 19행에서 진행하고 있습니다.
현재 진행량은 코드상에서 count 변수
전체 진행향은 코드상에서 MAX 변수입니다.

진행률을 계산했으면 해당 진행률을 기준으로 프로그레스바(진행바)를 출력해야합니다.
100(%)/프로그레스바 길이 = 몇 %마다 프로그레스바 1개 출력
만약 프로그레스바의 길이가 20이라고 하면
100/20 = 5
[====================] 100%
위의 모습일겁니다.

길이는 고정되어있음으로 진행률 퍼센트에 따라 = 문자를 출력해줘야 하죠
코드의 13행에서 해당 계산을 진행하고 있습니다.
계산 후 tick 이라는 변수에 저장해두었습니다.

20길이의 프로그레스바는 5% 마다 = 한개를 출력합니다.
10%라고 하면 == 를 출력하겠죠?

17~31행의 while 문은 0~전체 진행량까지 반복하는 반복문입니다.
19행에서 매번 반복마다 진행률(%)을 계산하여
20행에서 프로그레스바 = 문자를 몇개 출력할지 계산한 후
그 아래 21행 for문에서 출력을 합니다.

for문은 0~LEN 까지 반복을 하는데 LEN은 프로그레스바의 길이가 저장되있는 변수이름입니다.
20이라고 가정하면 0~20까지 반복하계되죠
bar_count는 20행에서 현재 %는 몇개의 =문자를 출력할지 저장되어있습니다.

만약 프로그레스바 길이가 20이고 진행률이 7%라고 가정합시다.

1 - 13행처럼 먼저 몇 %마다 =문자를 출력할지 계산
100/20 = 5(%)
tick = 5

2 - bar_count에 현재 퍼센트는 몇개의 =를 출력할지 계산
percent/tick = 갯수
7/5 = 1(나머지 버림)
bar_count = 1

3 - for문에서 출력
LEN이 20이므로 i = 0~20
if(bar_count > i) 
0~20까지 i가 증가하면서 bar_count와 비교하여 출력
bar_count는 현재 1이 저장되어있으므로 i가 0일때만 참
20번 반복하면서 =하나를 출력하게 되고
거짓인 경우에는 else 로 가서 공백을 출력합니다.

4 - for문으로 출력 후 퍼센트 출력 및 count 증가
count(현재 진행량)를 1 증가

위의 과정을 현재 진행량~전체 진행량까지 반복하여 100%가 되면 종료합니다.
출력하는데 왜 이어서 출력이 되지않고 원래 위치 그대로에서 출력될까요?
그 문제는 18행에 있습니다.
printf("\r")

\r 이스케이프 시퀀스는 해당 라인의 첫 번째 위치로 이동합니다.
첫 번째로 이동한 후 다시 출력을 하게되어 위치가 바뀌지않고 진행되는이유입니다.

 

[출처] https://geundung.dev/43

 

 

반응형

댓글()

정규표현식 연속된 문자 검색

프로그래밍/BASH SHELL|2023. 6. 2. 08:16
반응형

시스템 운영을하며 많이 접하는 명령이 grep 이기도 한데 구체적인 문자열 검색을 위해 정규표현식이 사용됩니다.

어떤 행에서 '몇개의 숫자, 점, 몇개의 숫자' 로 이루어진 문자열은 아래와 같이 출력합니다.

 

grep '[0-9]*[.][0-9]*'

 

 

반응형

댓글()

[ShellScript] 로그 파일 실시간 감시 및 마지막행 처리 방법

프로그래밍/BASH SHELL|2023. 3. 29. 10:57
반응형

쉘스크립트 파일을 아래 내용으로 작성하고 실행하면 됩니다.

 

# vi monitor_and_run.sh

#!/bin/bash

FILE="/home/sysdocu/app.log" # 감시할 파일명

# 파일 감시 및 처리
tail -F -n 0 "$FILE" |\
while read line
do
    # 로그에서 특정 문자열 확인 및 처리
    case "$line" in
        *"test"*) # 여기에 일치되는 문자열
            echo 마지막으로 추가된 행 내용 : $line
        ;;
   esac
done

 

* 결과

마지막으로 추가된 행 내용 : 이건 test 입니다.

마지막으로 추가된 행 내용 : lasttest

마지막으로 추가된 행 내용 : test

마지막으로 추가된 행 내용 : test 끝

 

반응형

댓글()

[쉘스크립트] 오래된 백업 파일 삭제하기

프로그래밍/BASH SHELL|2023. 1. 13. 09:31
반응형

백업스크립트로 데이터를 백업할때 디스크용량이 꽉 차는것을 방지하기 위해 보통은 스크립트 상단에 오래된 백업 파일 또는 디렉토리를 삭제하도록 합니다.

하지만 오래된 디렉토리를 삭제할 경우 그 안의 내용은 지워지지만 디렉토리 자체는 날짜가 갱신되어 (Access, Modify, Change) 삭제가 되지 않습니다.

이 경우 아래와 같이 조치가 가능합니다.

 

예) 20 으로 시작되는 날짜 디렉토리 중 30일이 초과된 디렉토리 삭제

 

1) 기존 방법

명령 : find /backup/20* -ctime +30 -exec rm -rf {} \;

결과 : 날짜가 오래된 디렉토리 내 파일은 삭제되지만 디렉토리는 남게됩니다.

 

2) 새 방법

디렉토리의 변경되지 않는 Birth 날짜와 현재 날짜를 비교하여 삭제

cd /backup
LIST=`stat -c %n" "%w 20* |sed -e 's/-//g' |awk {'print $1" "$2'}`
while read i j; do # i : Directory name, j : Birth date
    if [ $j -le `date +%Y%m%d --date '30 days ago'` ]; then
        rm -rf $i
    fi;
done <<< "$LIST"

 

* 참고

파일 또는 디렉토리의 날짜 확인

# stat 20230102
  File: 20230102
  Size: 30         Blocks: 0          IO Block: 4096   디렉토리
Device: 821h/2081d Inode: 1799764911  Links: 4
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-11 12:00:01.478938107 +0900
Modify: 2023-01-02 12:00:02.236334564 +0900
Change: 2023-01-02 12:00:02.236334564 +0900
 Birth: 2023-01-02 00:00:01.354856557 +0900

 

반응형

댓글()

쉘스크립트 rsync 실행시 끝에 \#015 문자가 붙는 경우 조치방법

프로그래밍/BASH SHELL|2023. 1. 11. 14:44
반응형

파일 리스트 등의 결과를 변수에 넣고 rsync 로 한줄씩 사용하고자 할때 아래와 같은 현상이 발생되었습니다.

이밖에 다른 경우에도 같은 현상이 나타날 수 있는데, 이때 해결방법은 아래와 같습니다.

 

방법1)

리스트가 list.txt 에 있는 경우 개행문자를 제거하고

list_new.txt 라는 새로운 파일에 입력합니다.

 

# tr -d '\r' < list.txt > list_new.txt

 

방법2)

sed -i 's/^M//' list.txt

 

여기에서 ^M 은 ctrl 키를 누른 상태에서 v, m 을 순서대로 누르는 것입니다.

(ctrl + v + m)

 

반응형

댓글()