~/.profile
โดยทั่วไปจะไม่อ่านเมื่อคุณเรียกใช้ssh somecommand
ซึ่งต่างจากเซสชัน ssh แบบอินเทอร์แอคทีฟ (หรือวิธีการเข้าสู่ระบบอื่นที่คุณเริ่มเซสชันการโต้ตอบ)
Ssh รองรับการส่งตัวแปรสภาพแวดล้อม ใน OpenSSH ใช้คำสั่งในSendEnv
~/.ssh/config
อย่างไรก็ตามตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงจะต้องเปิดใช้งานด้วยAcceptEnv
คำสั่งในการกำหนดค่าเซิร์ฟเวอร์ดังนั้นสิ่งนี้อาจไม่ได้ผลสำหรับคุณ
OpenSSH ยังอนุญาตให้ตั้งค่าตัวแปรสภาพแวดล้อมทางฝั่งเซิร์ฟเวอร์ อีกครั้งต้องเปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์ที่นี่พร้อมกับPermitUserEnvironment
คำสั่ง ~/.ssh/environment
ตัวแปรที่สามารถตั้งค่าในแฟ้ม สมมติว่าคุณใช้การรับรองความถูกต้องของกุญแจสาธารณะคุณยังสามารถตั้งค่าตัวแปรต่อคีย์ใน~/.ssh/authorized_keys
: เพิ่มenvironment="FOO=bar"
ที่จุดเริ่มต้นของบรรทัดที่เกี่ยวข้อง
สิ่งหนึ่งที่ฉันคิดว่าใช้งานได้เสมอ (ผิดปกติพอ) ตราบใดที่คุณใช้การพิสูจน์ตัวตนด้วยรหัสสาธารณะคือ(ab) ใช้command=
ตัวเลือกในauthorized_keys
ไฟล์ รหัสที่มีcommand
ตัวเลือกนั้นดีสำหรับการเรียกใช้คำสั่งที่ระบุเท่านั้น แต่คำสั่งในauthorized_keys
ไฟล์จะทำงานโดยมีตัวแปรสภาพแวดล้อมSSH_ORIGINAL_COMMAND
ตั้งเป็นคำสั่งที่ผู้ใช้ระบุ (ว่างสำหรับเซสชันแบบโต้ตอบ) ดังนั้นคุณสามารถใช้สิ่งนี้ใน~/.ssh/authorized_keys
(แน่นอนมันจะไม่ใช้ถ้าคุณไม่ใช้คีย์นี้เพื่อตรวจสอบ):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
โปรดทราบว่าฉันใส่ตัวแบ่งบรรทัดด้านบนเพื่อความชัดเจน แต่จริงๆแล้วต้องอยู่ในบรรทัดเดียว
ความเป็นไปได้อีกอย่างหนึ่งคือการเขียนสคริปต์ตัวตัดคำ~/bin/rsync-wrapper
บนเซิร์ฟเวอร์
#!/bin/sh
. ~/.profile
exec rsync "$@"
แล้วส่งผ่าน--rsync-path='bin/rsync-wrapper'
บนrsync
บรรทัดคำสั่ง อาร์กิวเมนต์--rsync-path
จะถูกขยายจากเปลือกดังนั้นหากคุณต้องการคุณสามารถทำให้บรรทัดคำสั่ง rsync --rsync-path='. ~/.profile; rsync'
อยู่ในตัวเองโดยผ่านสิ่งที่ต้องการ
มีอเวนิวอีกทางหนึ่งซึ่งขึ้นอยู่กับเชลล์ล็อกอินของคุณว่าเป็น bash หรือ zsh Bash จะอ่านทุก~/.bashrc
ครั้งเมื่อมีการเรียกใช้โดย rshd หรือ sshd แม้ว่าจะไม่ใช่การโต้ตอบ (แต่ไม่ใช่ถ้าเรียกว่าเป็นsh
) zsh ~/.zshenv
เสมออ่าน
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi