บางทีปัญหา No such file or directory / Private Key ใช้ไม่ได้ สรุปเกิดจากแค่เรื่อง CTRL-M (^M)

จริงๆ ปัญหาเรื่อง CTRL-M (^M) มันมีนานมากแล้วนะ เพราะเวลาโยนไฟล์ข้าม จาก Windows > Linux เพราะ

  • Windows ตัว carriage return character (CR+LF)
  • Linux ตัว carriage return character (LF)

ตัวอย่างปัญหา

อย่าง Blog ผมเองมีจดไว้ตอนฝึกงานโน้นเลย แต่พอดีว่าเจอปัญหานี้อีกรอบ ตอน Setup Server ใหม่ เลยมาเขียน Recap หน่อย เพราะมันอารมณ์ผีหลอกจริงๆ เช่น

- No such file or directory

ตัวอย่างนี้ มันบอกว่าหา path ไม่เจอ

sh: /usr/bonanza/interface/script/inf3sys
/template/op_configure.sh: No such file or directory
/usr/bonanza/interface/script/inf3sys/invsbch_opintf.ksh[5]: /usr/bonanza/interface/log/inf3sys
/inv_extrasecurity.opgenlog: cannot create [No such file or directory]
/usr/bonanza/interface/script/inf3sys/invsbch_opintf.ksh[6]: /usr/bonanza/inter

แต่ถ้าลองไล่จาก Script ลอง echo มันจะออกได้ปกติ อย่างเคสผม Korn Shell เดิม มันจะ มันจะถูกดึงจากไฟล์ properties มาใส่ตัวแปร $scriptPath แล้วที่นี้

  • ลอง echo $scriptPath ดูปกตินะ
  • ลองเรียกตรงๆ Error ซะงั้น $scriptPath
No such file or directory/script/inf3sys

หลังจากไล่ไปสักพัก เจอสาเหตุแล้ว ลองตรวจด้วยคำสั่ง cat -v <PathToFile> จะพบ ^M

cat -v config.properties

#Sun Jun 20 16:50:21 ICT 2021^M
logpath=/usr/bonanza/interface/log/inf3sys^M
FILEFOLDER=/usr/bonanza/interface/temp/cbs/^M
auth=true^M
#sftppath=/INVS/Interface/FromINVS^M
sftppath=/home/invsbch/inf3sys^M
password=06E04166E99688CB14EFF93B44A2D9E1E5AAEA9749D803D1BDC71A511265F7DB^M
#sftpserver=192.168.1.^M
#sftpserver=128.1.0.18^M
sftpserver=192.168.1.212^M
cbspath=/CBS/Interface/ToINVS^M
prefixSubject=^M
- Private Key ใช้ไม่ได้

ถ้าลอง ssh แล้วเจออะไรแปลกๆ ก็ลอง cat -v มาดูนะ จะเจอ ^M

-----BEGIN OPENSSH PRIVATE KEY-----^M
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn^M
NhAAAAAwEAAQAAAgEAvkF1QyUuaaMYm7jHQ7fOUSa4msnQXd7Uxezp/xymj7xHNXB04dTd^M
..
3IPz1DD+If3yF9AccsQlzyJ4hcl5IGO49Vdk7PS8qqhvYt2KgHHvqrQlWMjjO6hE1BHyD7^M
nJW4ujt0dxonfkX7mdrkqN70f9XcpgRIvLw4qzcPpL26yUIROs30Pcz6f+Z6KrNjmZHbNW^M
2UoILiQAkKoBAAAAEXJvb3RAaW52c2RldmFwcDAxAQ==^M
-----END OPENSSH PRIVATE KEY-----^M

การแก้ไข

บน Linux

  • ใช้ dos2unix 
dos2unix filename
  • ใช้ sed
sed -e "s/\r//g" file > newfile

บน Windows สามารถใชั Tools อย่าง Notepad++ ได้ โดยไปที่ menu Edit -> EOL Conversion -> และเลือกที่ต้องการได้เลย

จบไปและ จดไว้ เผื่อให้ Google / AI มาช่วยหาในอนาคต


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.