คุณอาจไม่ควรทำสิ่งนี้ แต่ทำได้ คำตอบของ Kusalanandaดีกว่าสำหรับงานในมือและอธิบายปัญหา เนื่องจากคุณถามวิธีการใช้การเรียกใช้ไลบรารีใด ๆภายในเทอร์มินัลโดยเฉพาะนี่คือบางวิธี ...
จิ๋ว C คอมไพเลอร์ ( tcc
) สนับสนุน-run
ธงที่ช่วยให้คุณ (ในผล) ตีความรหัส C โดยการเขียนโปรแกรมขนาดเล็กเพื่อให้คุณสามารถใช้โทรห้องสมุดใด ๆ ภายในอาคารผู้โดยสารผ่านการภาวนาเดียวว่า
คุณสามารถเรียกใช้strnlen
ฟังก์ชันดังนี้:
$ tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
ใช้การทดแทนกระบวนการจาก Bash, zsh และเชลล์อื่น ๆ ที่จะให้tcc
ไฟล์อ่านที่ดูเหมือนจะมีผลลัพธ์ของecho
s ทั้งหมด มีตัวเลือกอื่น ๆ
คุณสามารถสร้างฟังก์ชั่นเพื่อสร้างสิ่งนี้สำหรับคุณ:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(ฉันเคยใช้strlen
ที่นี่เพื่อที่จะเป็นสตริงฟังก์ชัน unary-> int - คุณต้องการฟังก์ชันแยกต่างหากสำหรับ arity และประเภทการส่งคืนที่แตกต่างกัน)
ตัวเลือกหนึ่งคือปลั๊กอินทุบตีโดย Tavis Ormandy ซึ่ง wraps ขึ้นและ นี่อาจเป็นการประมาณที่ใกล้เคียงที่สุดกับสิ่งที่คุณพยายาม คุณสามารถใช้ตัวอย่างเช่น:ctypes.sh
dlopen
dlsym
$ dlcall -r uint64 strlen "hello world"
และจะเรียกใช้ฟังก์ชันตามที่คาดไว้
นี่เป็นวิธีที่ตรงที่สุดในการทำ "จากเทอร์มินัล" แต่ไม่น่าจะเป็นแพคเกจการแจกจ่ายของคุณดังนั้นคุณต้องติดตั้งด้วยตนเอง (ซึ่งไม่สำคัญ) ต่อไปนี้เป็นคำพูดที่ให้ctypes.sh
ข้อมูลจากเว็บไซต์ของตัวเองเพื่อสร้างความประทับใจโดยทั่วไปว่าผู้คนรู้สึกอย่างไรกับการทำสิ่งนี้:
- "นั่นน่าขยะแขยง"
- "นี่ต้องหยุด"
- "คุณไปไกลเกินไปกับเรื่องนี้"
อาจมีเครื่องมือที่คล้ายกันสำหรับหอยอื่น ๆ แต่ฉันไม่รู้เกี่ยวกับพวกเขา ในทางทฤษฎีไม่มีเหตุผลที่จะไม่มีคำสั่งแบบสแตนด์อโลนที่ทำสิ่งนี้อย่างแน่นอนสำหรับกรณีง่าย ๆ แต่ฉันค่อนข้างแปลกใจที่ฉันไม่สามารถหา ...
... ดังนั้นฉันจึงได้ทำ! dlcall
ให้คุณเรียกใช้ฟังก์ชันไลบรารีจากบรรทัดคำสั่ง :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
สนับสนุนชุดฟังก์ชันต้นแบบที่ จำกัด ซึ่งยังไม่น่าเชื่อถือหรือมีความยืดหยุ่นอย่างมากในขณะนี้ แต่ตอนนี้มันมีอยู่แล้ว
ตัวอย่างเช่นคุณสามารถใช้Python และpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
แน่นอนว่าไม่ใช่วิธีที่ง่ายที่สุดในการใช้งาน Perl, Ruby และภาษาอื่น ๆ มีคุณสมบัติคล้ายกันที่คุณสามารถใช้ได้
ดังนั้นคำตอบสำหรับคำถามของคุณคือ:
- ใช้วิธีใดวิธีหนึ่งข้างต้น
- คุณไม่จำเป็นต้องใช้คำสั่งอื่นบูตคุณเข้าสู่ห้องสมุดหรือชิ้นส่วนของซอฟต์แวร์ที่ตะขอเข้าไปในเปลือกของคุณ
โดยรวมแล้วคุณจะทำได้ดีกว่าอย่างอื่น