~/.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