~/.profile
ดำเนินการโดยเชลล์ล็อกอินเท่านั้น โปรแกรมที่เรียกใช้เชลล์ตัดสินใจว่าเชลล์จะเป็นเชลล์ล็อกอินหรือไม่ (โดยการใส่-
อักขระตัวแรกของอาร์กิวเมนต์ zeroth บนการเรียกใช้เชลล์) โดยทั่วไปจะไม่ดำเนินการเมื่อคุณเข้าสู่ระบบเพื่อดำเนินการคำสั่งเฉพาะ
โดยเฉพาะอย่างยิ่ง OpenSSH จะเรียกใช้ล็อกอินเชลล์เฉพาะในกรณีที่คุณไม่ได้ระบุคำสั่ง ดังนั้นหากคุณระบุคำสั่ง~/.profile
จะไม่สามารถอ่านได้
OpenSSH อนุญาตให้ตั้งค่าตัวแปรสภาพแวดล้อมทางฝั่งเซิร์ฟเวอร์ สิ่งนี้จะต้องเปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์ด้วยPermitUserEnvironment
คำสั่ง ~/.ssh/environment
ตัวแปรที่สามารถตั้งค่าในแฟ้ม สมมติว่าคุณใช้การรับรองความถูกต้องของกุญแจสาธารณะคุณยังสามารถตั้งค่าตัวแปรต่อคีย์ใน~/.ssh/authorized_keys
: เพิ่มenvironment="FOO=bar"
ที่จุดเริ่มต้นของบรรทัดที่เกี่ยวข้อง
Ssh ยังสนับสนุนการส่งตัวแปรสภาพแวดล้อม ใน OpenSSH ใช้คำสั่งในSendEnv
~/.ssh/config
อย่างไรก็ตามตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงจะต้องเปิดใช้งานด้วยAcceptEnv
คำสั่งในการกำหนดค่าเซิร์ฟเวอร์ดังนั้นสิ่งนี้อาจไม่ได้ผลสำหรับคุณ
สิ่งหนึ่งที่ผมคิดว่าก็ทำงาน (ผิดปกติพอ) ตราบใดที่คุณกำลังใช้ตรวจสอบคีย์สาธารณะคือการ(AB) ใช้command=
ตัวเลือกในauthorized_keys
ไฟล์ รหัสที่มีcommand
ตัวเลือกนั้นดีสำหรับการเรียกใช้คำสั่งที่ระบุเท่านั้น แต่คำสั่งในauthorized_keys
ไฟล์จะทำงานโดยมีตัวแปรสภาพแวดล้อมSSH_ORIGINAL_COMMAND
ตั้งเป็นคำสั่งที่ผู้ใช้ระบุ ตัวแปรนี้ว่างเปล่าหากผู้ใช้ไม่ได้ระบุคำสั่งและคาดว่าจะมีเชลล์แบบโต้ตอบ ดังนั้นคุณสามารถใช้สิ่งนี้ใน~/.ssh/authorized_keys
(แน่นอนมันจะไม่ใช้ถ้าคุณไม่ใช้คีย์นี้เพื่อตรวจสอบ):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
ความเป็นไปได้อีกอย่างหนึ่งคือการเขียนสคริปต์ตัวตัดคำบนเซิร์ฟเวอร์ สิ่งต่อไปนี้ใน~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
จากนั้นให้เชื่อมโยงสัญลักษณ์เพื่อสคริปต์นี้เรียกว่าrsync
, unison
ฯลฯ ผ่าน--rsync-path='bin/rsync'
บนrsync
บรรทัดคำสั่งและอื่น ๆ สำหรับโปรแกรมอื่น ๆ อีกวิธีหนึ่งคือบางคำสั่งอนุญาตให้คุณระบุข้อมูลโค้ดเปลือกทั้งเพื่อให้ทำงานจากระยะไกลซึ่งจะช่วยให้คุณที่จะทำให้คำสั่งในตัวเอง: เช่นกับ 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